我有一个列表如下:
List<List<Integer>> matchedPostions = findTerms(originalEntPos, singularEntPos, singText);
这包括例如以下
[ID,[StartPostion,EndPostion]]
[1,[198,200]]
[2,[50,61]]
我正在尝试使用Collections.sort()对列表进行排序。我该怎么做呢,它根据StartPostion中的值从matchPostion中的值排序,从较低值到较高值?
答案 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));
}
});