我正在寻找一种数据结构,我可以存储一对Integer
和String
我将能够对其进行两次排序:一次按整数降序排序,一次按词汇顺序排序。
我还希望能够动态添加新的对。
例如:{(13,a)(12,d) (9,a)}
按数字排序:{(13, a) (12, d) (9,a)}
按词汇顺序排序:{(9, a) (13, a) (12, d)}
你有什么建议?
最佳答案
创建一个类Pair
它保存一个整数和一个字符串:
public class Pair {
private Integer num;
private String text;
public Pair(Integer num, String text) {
this.num = num;
this.text = text;
}
public Integer getNum() { return num; }
public String getText() { return text; }
}
List<Pair> list = new ArrayList<>();
list.add(new Pair(13, "a"));
list.add(new Pair(12, "d"));
list.add(new Pair(9, "a"));
Java 8 在排序时确实支持自定义内联比较器,但在您的情况下,您似乎需要两级排序,首先按数字排序,然后按文本排序(对于其他比较器反之亦然)。在本例中,我们定义两个自定义比较器。第二个排序条件是通过 Comparator#thenComparing()
添加的以链接方式的方法。然后,我们将流转换为实际的排序列表。
Comparator<Pair> c1 = Comparator.comparing(pair -> -pair.num);
c1 = c1.thenComparing(Comparator.comparing(pair -> pair.text));
Stream<Pair> pairStream = list.stream().sorted(c1);
List<Pair> sortedPairs = pairStream.collect(Collectors.toList());
System.out.println("Sorting descending by number:");
for (Pair p : sortedPairs) {
System.out.println("(" + p.getNum() + ", " + p.getText() + ")");
}
Comparator<Pair> c2 = Comparator.comparing(pair -> pair.text);
c2 = c2.thenComparing(Comparator.comparing(pair -> pair.num));
pairStream = list.stream().sorted(c2);
sortedPairs = pairStream.collect(Collectors.toList());
System.out.println("Sorting ascending by text:");
for (Pair p : sortedPairs) {
System.out.println("(" + p.getNum() + ", " + p.getText() + ")");
}
输出:
Sorting descending by number:
(13, a)
(12, d)
(9, a)
Sorting ascending by text:
(9, a)
(13, a)
(12, d)
此处演示:
Rextester
关于java - 寻找可排序对的数据结构的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46390608/