Java:用于创建新排序列表的实用程序函数

时间:2014-02-04 12:15:19

标签: java collections

我发现自己有时会这样做:

List<String> keys = new ArrayList<String>(vii.slots.keySet());
Collections.sort(keys);
for(String index : keys) {
    ...

是否有一种方法(在公共场所,番石榴,无论哪里)在一行中执行此操作,例如:

for(String index : sorted(vii.slots.keySet())) {
    ...

很抱歉,如果这是一个常见问题解答,但是经过一些网络搜索我没能找到这个,我确信Java大师会在五秒钟后回答这个问题。

由于

4 个答案:

答案 0 :(得分:2)

Map<String,VarInfo> sorted = new TreeMap<String,VarInfo>(vii.slots);
for (Map.Entry<String,VarInfo> entry : sorted) {
   doStuff(entry.getKey(), entry.getValue());
}

答案 1 :(得分:1)

可能您需要某种SortedSet而不是List。如果你需要保持每个元素的出现次数 - 尝试使用番石榴TreeMultiset

一个例子:

Multiset<Integer> multiSet = TreeMultiset.create();
multiSet.add(2);
multiSet.add(2);
multiSet.add(1);
multiSet.add(5);
multiSet.add(6);
multiSet.add(6);
multiSet.add(3);
for (Integer i : multiSet) {
    System.out.print(i);
}

输出将是:

1223566

答案 2 :(得分:1)

一个选项是编写一个Iterable类,它将获取你的map并迭代键;然后你得到你的单行调用,不需要其它的图书馆依赖。

答案 3 :(得分:1)

Guava的ordering可能正是您所寻找的:

供您使用:

for (String index : Ordering.<String>natural().sortedCopy(vii.slots.keySet())) {
      System.out.println(index);
}

使用自然顺序的简单排序看起来像:

    List<String> list = new ArrayList<>();
    list.add("pops");
    list.add("chops");
    list.add("zebra");
    list.add("xam");

    for (String str : Ordering.<String>natural().sortedCopy(list)) {
        System.out.println(str);
    }

给出:

chops
pops
xam
zebra

Ordering也可以使用自定义Comparator个实例按所需顺序排序。