Java - 包含整数列表的TreeSet?

时间:2014-11-27 17:14:09

标签: java list sorting set

我需要一个包含整数列表的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();

    }
}

1 个答案:

答案 0 :(得分:3)

TreeSets有两种类型的构造函数 - 指定显式Comparator的构造函数和不指定的构造函数。在后一种情况下,集合将使用其元素的自然排序,这要求它们实现Comparable。这就是为什么你得到运行时异常,这是相对清楚的(一旦你理解了背景)。

由于您无法使ArrayLists实现Comparable,因此您需要提供自己的Comparator when you're constructing the TreeSet以分配给coords。这应该很容易实现(它只是一个带有两个对象的函数,并决定哪一个“先来”),你可以在那里放置你想要的任何自定义排序逻辑。