我需要一个包含整数列表的集合。每个列表包含 2 个 int 值(对于 x 和 y 坐标),我希望能够实现某种比较方法,以便根据列表的第一个值(X 值)按升序对 Set 进行排序,以便第一个值非常大的列表将出现在 Set 的尾部。
这样而不是打印出来:
[2, 1]
[1, 2]
[3, 3]
[2, 3]
它打印出:
[1, 2]
[2, 1]
[2, 3]
[3, 3]
问题是我收到一个错误:
Exception in thread "main" java.lang.ClassCastException:
java.util.Arrays$ArrayList cannot be cast to java.lang.Comparable
老实说,我对这样的排序没有太多经验,因为我是初学者。任何帮助都会很棒,谢谢!
到目前为止的代码:
public class Shape implements Comparator<List<Integer>> {
private SortedSet<List<Integer>> coords;
@Override
public int compare(List<Integer> l1, List<Integer> l2) {
if (l1.get(0) > l2.get(0))
return 1;
else
return -1;
}
public Shape(int shapeID) {
coords = new TreeSet<List<Integer>>();
switch (shapeID) {
case 1:
coords.add(Arrays.asList(0, 2));
coords.add(Arrays.asList(1, 2));
coords.add(Arrays.asList(3, 2));
break;
case 2:
coords.add(Arrays.asList(1, 1));
coords.add(Arrays.asList(1, 2));
coords.add(Arrays.asList(2, 1));
break;
case 3:
coords.add(Arrays.asList(1, 3));
coords.add(Arrays.asList(2, 1));
coords.add(Arrays.asList(2, 3));
break;
}
coords.add(Arrays.asList(2, 2));
}
public void rotate() {
Iterator<List<Integer>> it = coords.iterator();
// should print out a sorted Set:
while (it.hasNext()) {
System.out.println(it.next());
// do more stuff here..
}
}
public static void main(String[] args) {
Shape s = new Shape(2);
s.rotate();
}
}
TreeSets
有两种类型的构造函数 - 一种指定显式Comparator
,另一种不指定。 在后一种情况下,集合将使用其元素的自然顺序,这要求它们实现Comparable
。 这就是为什么你会得到运行时异常,这是相对清楚的(一旦你了解了背景)。
由于您无法使 ArrayLists 实现 Comparable,因此在构造要分配给coords
的TreeSet
时,您需要提供自己的Comparator
。 这对你来说应该很简单(它只是一个函数,它接受两个对象,并决定哪一个"先来"),你可以把你想要的任何自定义排序逻辑放在那里。