排序List <list <integer>&gt;使用java Collections.sort()</list <integer>

时间:2014-05-12 12:23:40

标签: java sorting collections

我有一个列表如下:

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

这包括例如以下

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

我正在尝试使用Collections.sort()对列表进行排序。我该怎么做呢,它根据StartPostion中的值从matchPostion中的值排序,从较低值到较高值?

4 个答案:

答案 0 :(得分:4)

您需要实施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]]

这是&#34;脏&#34;办法。 Duncan描述了更为惯用的方法,您可以在其中实现正确封装数据的Range类。

答案 1 :(得分: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]

答案 2 :(得分:1)

对于内部列表,您可以循环遍历它们:

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

对于外部列表,您需要一个自定义比较器。

答案 3 :(得分: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));
                }
            });