我正在寻找一个数据结构我可以存储一对Integer
和String
我可以排序两次:一次按整数降序排列并通过词汇顺序一次。寻找一个可排序数据结构的建议
我也希望能够动态地添加一对。
例如:{(13,a)(12,d) (9,a)}
排序号:{(13, a) (12, d) (9,a)}
排序词汇顺序:{(9, a) (13, a) (12, d)}
什么你有什么建议?
我正在寻找一个数据结构我可以存储一对Integer
和String
我可以排序两次:一次按整数降序排列并通过词汇顺序一次。寻找一个可排序数据结构的建议
我也希望能够动态地添加一对。
例如:{(13,a)(12,d) (9,a)}
排序号:{(13, a) (12, d) (9,a)}
排序词汇顺序:{(9, a) (13, a) (12, d)}
什么你有什么建议?
既然你想存储一个订单的事情列表,我建议使用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()));
创建班级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不支持排序时自定义的内联比较,但在你的情况下,它显示了要两个级别的排序,首先由数字,然后通过短信(或副-versa为另一个比较器)。在这种情况下,我们定义了两个自定义比较器。第二种分拣条件通过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)
演示在这里:
这确实要求数据类本身不是Comparable
但使用是相当排序两种不同的Comparator
s。
其余的依赖于您的其他要求 - 修改集合比阅读更常见吗?你打算使用List
语义(集合中有重复的项目),还是将Set
?根据不同的情况,保存这些项目的结构可能是List
中的任何一种,其中有两种方法可根据两个比较器中的一个复制和排序列表,以保留两个TreeSet
s以保存预先排序的值。