我正在尋找一個數據結構我可以存儲一對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以保存預先排序的值。