使用Java的Collections.sort()对List<List<Integer>>进行排序

3

我有一个如下所示的列表:

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

考虑以下示例:
[ID,StartPostion,EndPostion]
      ^^^
[1,198,200]
[2,50,61]

我正在尝试使用Collections.sort()对列表进行排序。我该如何根据StartPostion的值,从低到高对matchedPostions中的值进行排序?


1
你正在尝试对用户定义的对象进行排序。你需要使用Comparator或Comparable接口。这些链接将对你有所帮助。http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1/ - Prasad Kharkar
2
这不像是一个整数列表的列表。这将是一个列表的列表:[1,198,200],[2,50,61] - Sergey Kalinichenko
1
内部列表看起来像是一个坐标值,为什么不为它定义一个类呢? - Owen Cao
5个回答

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]]

这是一种“不太规范”的方法。更常见的方式是按照Duncan的描述实现一个Range类,以正确封装您的数据。

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方法进行排序:

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

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

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

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

1
如果您无法为范围定义自己的专业类,则可以使用自己的比较器调用Collections.sort。以下是示例:
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));
                }
            });

0

在Java中使用sort()函数,您可以轻松地使用lambda函数进行排序:List<List> ans = new LinkedList<>();

ans.sort((x, y) -> {
        for (int i = 0; i < Math.min(x.size(), y.size()); i++) {
            if (x.get(i) != y.get(i)) {
                return x.get(i) - y.get(i);
            }
        }
        return x.size() - y.size();
    });

使用lambda函数对整数列表的列表进行排序的另一种方法 [点赞以获取更多类似的Java解决方案 ♨︎]。


这是使用lambda函数对整数列表的列表进行排序的另一种方法 [点赞以获取更多类似的Java解决方案 ♨︎]。 - NARESH CHOUDHARY
这是使用lambda函数对List of List of Integer进行排序的另一种方法 [点赞以获取更多类似的Java解决方案 ♨︎]。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接