2014-05-12 83 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)); 
       } 
      });