我需要一个包含整数列表的Set。每个List包含2个int值(对于x和y坐标),我希望能够实现某种比较方法,以便Set按照列表的第一个值(X值)按升序排序,以便列表第一个值非常大,将出现在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();
}
}
答案 0 :(得分:3)
TreeSets
有两种类型的构造函数 - 指定显式Comparator
的构造函数和不指定的构造函数。在后一种情况下,集合将使用其元素的自然排序,这要求它们实现Comparable
。这就是为什么你得到运行时异常,这是相对清楚的(一旦你理解了背景)。
由于您无法使ArrayLists实现Comparable,因此您需要提供自己的Comparator
when you're constructing the TreeSet
以分配给coords
。这应该很容易实现(它只是一个带有两个对象的函数,并决定哪一个“先来”),你可以在那里放置你想要的任何自定义排序逻辑。