0

我创建了以下方法:

public List<String> listAll() {
    List worldCountriesByLocal = new ArrayList();

    for (Locale locale : Locale.getAvailableLocales()) {
        final String isoCountry = locale.getDisplayCountry();
        if (isoCountry.length() > 0) {
            worldCountriesByLocal.add(isoCountry);
            Collections.sort(worldCountriesByLocal);
        }
    }
    return worldCountriesByLocal;
}

它非常简单,它返回用户区域设置中的世界国家列表。然后我对其进行排序以使其按字母顺序排列。这一切都很完美(除了我似乎偶尔会得到国家的重复!)。

无论如何,我需要的是将美国和英国放在首位。我遇到的问题是我无法隔离将为美国和英国返回的索引或字符串,因为这是特定于语言环境的!

任何想法都会非常感激。

4

4 回答 4

8

无论如何,我需要的是将美国和英国放在首位。我遇到的问题是我无法隔离将为美国和英国返回的索引或字符串,因为这是特定于语言环境的!

听起来您应该实现自己的Comparator<Locale>以通过以下步骤比较两个语言环境:

  • 如果语言环境相同,则返回 0
  • 如果一个地区是美国,那就“赢”
  • 如果一个地区是英国,那就“赢”
  • 否则,使用o1.getDisplayCountry().compareTo(o2.getDisplayCountry())(即委托给现有行为)

(这将使美国排在英国之前。)

然后Collections.sort使用您的自定义比较器的实例调用。

在提取国家名称之前执行所有这些操作 - 然后从排序列表中提取它们。

于 2012-10-05T14:02:45.597 回答
1

是的,当您进行排序时,只需提供您自己的比较器

Collections.sort(worldCountriesByLocal, new Comparator() {

    @Override
    public int compare(String o1, String o2) {
        if (o1.equals(TOP_VALUE))
            return -1;
        if (o2.equals(TOP_VALUE))
            return 1;
        return o1.compareTo(o2);
    }
})

最高价值将是您想要始终在顶部的价值

于 2012-10-05T14:05:10.463 回答
1

我会编写自己的 POJO,其排序标记由一个整数分配优先级组成(例如,0 代表美国,1 代表英国,2 代表其他所有人),然后是一些分隔符,然后是国家名称。然后我会将数组放入由该排序 ID 和 POJO 作为 val 键的 HashMap 中。然后,我将从地图中对键进行排序并遍历排序并检索每个排序键的普通国家名称。

例如

2.Sweden
2.France
2.Tanzania
0.US
1.UK

排序

0.US
1.UK
2.France
2.Sweden
2.Tanzania

编辑:仅当您有除国家名称以外的更多字段时才需要 POJO。如果只是国家名称,我会将排序 ID 设置为哈希键,将国家名称设置为 val 并跳过 POJO 部分。

于 2012-10-05T14:05:47.960 回答
1

您还可以使用 aTreeSet来消除重复项,并使用您自己的aComparator来将 US 和 GB 带到开头。

您会得到重复项(这将消除),因为每个国家/地区通常有不止一个语言环境。例如,有一个美国(西班牙)和一个美国(英语),还有三个瑞士(法国、德国和意大利)。

public class AllLocales {
  // Which Locales get priority.
  private static final Locale[] priorityLocales = {
    Locale.US,
    Locale.UK
  };

  private static class MyLocale implements Comparable<MyLocale> {
    // My Locale.
    private final Locale me;

    public MyLocale(Locale me) {
      this.me = me;
    }

    // Convenience
    public String getCountry() {
      return me.getCountry();
    }

    @Override
    public int compareTo(MyLocale it) {
      // No duplicates in the country field.
      if (getCountry().equals(it.getCountry())) {
        return 0;
      }
      // Check for priority ones.
      for (int i = 0; i < priorityLocales.length; i++) {
        Locale priority = priorityLocales[i];
        // I am a priority one.
        if (getCountry().equals(priority.getCountry())) {
          // I come first.
          return -1;
        }
        // It is a priority one.
        if (it.getCountry().equals(priority.getCountry())) {
          // It comes first.
          return 1;
        }
      }
      // Default to straight comparison.
      return getCountry().compareTo(it.getCountry());
    }
  }

  public static List<String> listAll() {
    Set<MyLocale> byLocale = new TreeSet();
    // Gather them all up.
    for (Locale locale : Locale.getAvailableLocales()) {
      final String isoCountry = locale.getDisplayCountry();
      if (isoCountry.length() > 0) {
        //System.out.println(locale.getCountry() + ":" + isoCountry + ":" + locale.getDisplayName());
        byLocale.add(new MyLocale(locale));
      }
    }
    // Roll them out of the set.
    ArrayList<String> list = new ArrayList<>();
    for (MyLocale l : byLocale) {
      list.add(l.getCountry());
    }
    return list;
  }

  public static void main(String[] args) throws InterruptedException {
    // Some demo usages.
    List<String> locales = listAll();
    System.out.println(locales);
  }
}
于 2012-10-05T14:54:18.497 回答