我正在寻找一个数据结构,我可以存储一对Integer
和String
我将能够对它进行两次排序:一次按整数降序排序,一次按词法排序。
我还希望能够动态添加新对。
例如:{(13,a)(12,d) (9,a)}
按数字排序:{(13, a) (12, d) (9,a)}
按词汇顺序排序:{(9, a) (13, a) (12, d)}
你会建议什么?
答案 0 :(得分:1)
创建一个包含整数和字符串的类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)
在这里演示:
答案 1 :(得分:0)
由于您希望使用 order 存储一系列内容,我建议使用List
。
此List
将要存储的类型为IntegerStringPair
,其定义如下:
class IntegerStringPair {
private int integer;
private String string;
public int getInteger() {
return integer;
}
public String getString() {
return string;
}
public IntegerStringPair(int integer, String string) {
this.integer = integer;
this.string = string;
}
}
您的列表将按以下方式声明:
List<IntegerStringPair> list = new ArrayList<>();
要对列表进行排序,您可以执行以下操作:
// by integer
list.sort((x, y) -> Integer.compare(x.getInteger(), y.getInteger()));
// by string lexically
list.sort((x, y) -> x.getString().compareTo(y.getString()));
答案 2 :(得分:0)
这确实需要一个本身不是Comparable
的数据类,而是使用两个不同的Comparator
进行排序。
其余要求取决于您的其他要求 - 修改集合比阅读更常见吗?您打算使用List
语义(在集合中有重复的项目)还是将成为Set
?根据这些,持有项目的结构可能是List
的两个方法,根据两个比较器之一复制和排序列表,到两个TreeSet
来保存预先排序的值