2017-09-24 86 views
0

我正在尋找一個數據結構我可以存儲一對IntegerString
我可以排序兩次:一次按整數降序排列並通過詞彙順序一次。尋找一個可排序數據結構的建議

我也希望能夠動態地添加一對。

例如:{(13,a)(12,d) (9,a)}

排序號:{(13, a) (12, d) (9,a)}

排序詞彙順序:{(9, a) (13, a) (12, d)}

什麼你有什麼建議?

回答

0

既然你想存儲一個訂單的事情列表,我建議使用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())); 
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不支持排序時自定義的內聯比較,但在你的情況下,它顯示了要兩個級別的排序,首先由數字,然後通過短信(或副-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) 

演示在這裏:

Rextester

0

這確實要求數據類本身不是Comparable但使用是相當排序兩種不同的Comparator s。

其餘的依賴於您的其他要求 - 修改集合比閱讀更常見嗎?你打算使用List語義(集合中有重複的項目),還是將Set?根據不同的情況,保存這些項目的結構可能是List中的任何一種,其中有兩種方法可根據兩個比較器中的一個複製和排序列表,以保留兩個TreeSets以保存預先排序的值。