2017-10-06 57 views
2

我很難理解排序映射的正確語法,哪些值不只是一種類型,而是可以再次嵌套。 我會盡力拿出這裏安裝例:如何按鍵和值對映射進行排序,而Val是映射/列表本身

讓我們做一個隨機類爲第一:

class NestedFoo{ 
int valA; 
int valB; 
String textA; 

public NestedFoo(int a, int b, String t){ 
    this.valA = a; 
    this.valB = b; 
    this.textA = t; 
    } 
} 

好吧,這是我們班。 這裏談到的列表:

HashMap<Integer, ArrayList<NestedFoo>> sortmePlz = new HashMap<>(); 

讓我們創建3項下手,應該表現出整理作品了。

ArrayList<NestedFoo> l1 = new ArrayList<>(); 
n1 = new NestedFoo(3,2,"a"); 
n2 = new NestedFoo(2,2,"a"); 
n3 = new NestedFoo(1,4,"c"); 
l1.add(n1); 
l1.add(n2); 
l1.add(n3); 

ArrayList<NestedFoo> l2 = new ArrayList<>(); 
n1 = new NestedFoo(3,2,"a"); 
n2 = new NestedFoo(2,2,"a"); 
n3 = new NestedFoo(2,2,"b"); 
n4 = new NestedFoo(1,4,"c"); 
l2.add(n1); 
l2.add(n2); 
l2.add(n3); 
l2.add(n4); 

ArrayList<NestedFoo> l3 = new ArrayList<>(); 
n1 = new NestedFoo(3,2,"a"); 
n2 = new NestedFoo(2,3,"b"); 
n3 = new NestedFoo(2,2,"b"); 
n4 = new NestedFoo(5,4,"c"); 
l3.add(n1); 
l3.add(n2); 
l3.add(n3); 
l3.add(n4); 

甜,現在把它們放在我們的地圖。

sortmePlz.put(5,l1); 
sortmePlz.put(2,l2); 
sortmePlz.put(1,l3); 

我現在想什麼,是由它的鍵排序,首先整個地圖,所以順序應該是L3 L2 L1。 然後,我想每個鍵內的列表按以下順序排序: intA,intB,text(全部升序)

我不知道該怎麼做。特別是從Java 8以及所有這些lambda表達式開始,我試圖閱讀這個主題,但感覺不知所措的代碼。

在此先感謝! 我希望代碼有沒有syntatical錯誤,我做了它在旅途中

+0

我不明白的問題,你想通過intA列表l3,intB列表l2和文本列表l1? –

+0

你的代碼有錯誤,主要是打字錯誤等。確保它先編譯並重新發布更新後的代碼。例如'public NestedFoo {int a,int b,String t)'你聲明的構造函數打開'{'而不是'(' – pleft

+0

@BrankVictoria,不,我想通過它的鍵來排序HashMap,然後爲每個值是一個arraylist)通過發號施令 – InDaPond

回答

3

可以使用TreeSet代替普通HashMap和你的價值觀會key自動排序:

Map<Integer, ArrayList<NestedFoo>> sortmePlz = new TreeMap<>();

第二步我有點困惑。 INTA,INTB,文本(所有升序)

我想您是通過比較第一intA值對列表進行排序,那麼如果它們相等比較:

由下列順序進行排序通過intB等。如果我的理解正確,您可以使用ComparatorcomparingthenComparing

sortmePlz.values().forEach(list -> list 
      .sort(Comparator.comparing(NestedFoo::getValA) 
          .thenComparing(NestedFoo::getValB) 
          .thenComparing(NestedFoo::getTextA))); 
+0

謝謝,我不知道thenComparing。然後讓TreeSet第一次看起來是最簡單的解決方案,還有另一種方法嗎? – InDaPond

1

使用TreeMap而不是HashMap,它解決了第一個問題:按鍵排序條目。

從地圖獲得所需的列表後,可以按瓦拉,值Valb,文字的ArrayList:

l1.sort(
       Comparator.comparing(NestedFoo::getValA).thenComparing(NestedFoo::getValB).thenComparing(NestedFoo::getTextA) 
     ); 

,改變你的NestedFoo類的定義是這樣的:

class NestedFoo { 
     int valA; 
     int valB; 
     String textA; 

     public NestedFoo(int a, int b, String t) { 
      this.valA = a; 
      this.valB = b; 
      this.textA = t; 
     } 

     public int getValA() { 
      return valA; 
     } 

     public void setValA(int valA) { 
      this.valA = valA; 
     } 

     public int getValB() { 
      return valB; 
     } 

     public void setValB(int valB) { 
      this.valB = valB; 
     } 

     public String getTextA() { 
      return textA; 
     } 

     public void setTextA(String textA) { 
      this.textA = textA; 
     } 
    } 
2

我米肯定有辦法與lambda做它,但它不是要求。請參閱Schidu Luca的解答,瞭解類似lambda的解決方案。

如果你想要一個'老學校的解決方案',請繼續閱讀。

您無法對地圖進行排序。它沒有意義,因爲在地圖中沒有秩序的概念。現在,有些地圖對象以排序的方式存儲密鑰(如TreeMap)。

您可以訂購一個清單。在你的情況下,使類NestedFoo可比(https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)。然後,您可以在列表中調用方法Collections.sorthttps://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-)。