如何对Pair <string,integer>列表进行排序?

时间:2015-04-28 12:50:30

标签: java apache-commons

我有一个通讯列表Pair,用于存储单词及其频率,如下所示

private List<Pair<String, Integer>> words = new ArrayList<Pair<String, Integer>();

我正在尝试对它进行排序,以便当我迭代它来打印单词时,我希望首先出现频率最高的单词。

我尝试过实施Comparable,但大多数示例与使用Pairs列表不相似

4 个答案:

答案 0 :(得分:16)

您可以使用自定义Comparator

Collections.sort(words, new Comparator<Pair<String, Integer>>() {
    @Override
    public int compare(final Pair<String, Integer> o1, final Pair<String, Integer> o2) {
        // TODO: implement your logic here
    }
});

答案 1 :(得分:15)

按降序编号

对元素进行排序
Collections.sort(words, Comparator.comparing(p -> -p.getRight()));

这将使用&#34;权利&#34;该对按降序排列。

这使用Java 8.理论上,您正在使用Integer.compareTo来装箱值。

然而,通过逃逸分析,可以消除拳击并且你没有创造任何物体。

答案 2 :(得分:2)

您好,我认为这应该适合您。

 List<Pair<String, Integer>> words = new ArrayList<Pair<String, Integer>>();
    words.add(new Pair<String, Integer>("hello",2));
    words.add(new Pair<String, Integer>("hello",1));
    words.add(new Pair<String, Integer>("aello",3));

    words.sort(new Comparator<Pair<String, Integer>>() {
        @Override
        public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
            if (o1.getValue() > o2.getValue()) {
                return -1;
            } else if (o1.getValue().equals(o2.getValue())) {
                return 0; // You can change this to make it then look at the
                          //words alphabetical order
            } else {
                return 1;
            }
        }
    });

    System.out.println(words);

答案 3 :(得分:2)

将Java 8 lambda与Comparator.comparing结合使用(您还需要颠倒顺序):

import static java.util.Collections.reverseOrder;
import static java.util.Comparator.comparing;

final List<Pair<String, Integer>> words = new ArrayList<>();
final Comparator<Pair<String, Integer>> c = reverseOrder(comparing(Pair::getValue));
Collections.sort(words, c);

如果您只想按频率降序打印值,则最简单:

words.stream()
        .sorted(c)
        .map(Pair::getKey)
        .forEach(System.out::println);