2014-05-12 31 views
1

我有一個列表如下:排序列表<列表<Integer>>用java Collections.sort()

List<List<Integer>> matchedPostions = findTerms(originalEntPos, singularEntPos, singText); 

這個incluse例如如下

[ID,[StartPostion,EndPostion]] 
[1,[198,200]] 
[2,[50,61]] 

我想對列表進行排序使用Collections.sort()。我該如何做到這一點,它根據StartPostion中的值從低到高的值對匹配的內容進行排序?

+1

您正在嘗試對用戶定義的對象進行排序。您將不得不使用比較器或類似的界面。這些鏈接將幫助你.http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1/ –

+2

這看起來不像整數列表。這將是一個列表清單:'[1,198,200],[2,50,61]' – dasblinkenlight

+1

內部列表看起來像一個座標值,爲什麼不爲它定義一個類。 –

回答

3

您需要實施Comparator來排序自定義數據結構,如您提供的那樣。

import static java.util.Arrays.asList; 

List<List<Integer>> matchedPostions = asList(asList(1, 198, 200), asList(2, 50, 61)); 
Collections.sort(matchedPostions, new Comparator<List<Integer>>() { 
    @Override 
    public int compare(List<Integer> o1, List<Integer> o2) { 
     // Sort the lists using the starting position (second element in the list) 
     return o1.get(1).compareTo(o2.get(1)); 
    } 
}); 

System.out.println(matchedPostions); 
// [[2, 50, 61], [1, 198, 200]] 

這是「髒」的方式。 Duncan描述了更習慣的方法,在那裏你實現了一個Range類,它可以正確地封裝你的數據。

1

對於內部列表,您可以通過它們只是循環:

for(List<Integer> inner : outer){ 
    Collections.sort(inner); 
} 

對於外部列表,您需要自定義比較。

3

我強烈建議你創建一個類來保存你的列表值。這使您可以享受類型安全的好處,包括確保始終有兩個整數值(而不是列表中未知數量的項目)。例如:

public class Range implements Comparable<Range> { 
    private final int startPosition; 
    private final int endPosition; 

    public Range(int startPosition, int endPosition) { 
     this.startPosition = startPosition; 
     this.endPosition = endPosition; 
    } 

    @Override 
    public int compareTo(Range o) { 
     return startPosition - o.startPosition; 
    } 

    @Override 
    public String toString() { 
     return String.format("[%d,%d]", startPosition, endPosition); 
    } 
} 

因爲這個類實現Comparable,您可以用正常Collections.sort method排序:

public static void main(String[] args) throws Exception { 
    List<Range> ranges = Arrays.asList(new Range(198, 200), new Range(50, 
      61)); 

    System.out.println("Unsorted"); 
    for (Range range : ranges) { 
     System.out.println(range); 
    } 

    Collections.sort(ranges); 

    System.out.println("Sorted"); 
    for (Range range : ranges) { 
     System.out.println(range); 
    } 
} 

輸出:

Unsorted 
[198,200] 
[50,61] 
Sorted 
[50,61] 
[198,200] 
1

如果你不能定義自己的專用類對於範圍,您可以撥打Collections.sort並使用您自己的Comparator。示例如下:

Collections.sort(list, new Comparator<List<Integer>>() { 
       @Override 
       public int compare(List<Integer> l1, List<Integer> l2) { 
        return l1.get(0).compareTo(l2.get(0)); 
       } 
      });