Java - 包含整数列表的树集



我需要一个包含整数列表的集合。每个列表包含 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,因此在构造要分配给coordsTreeSet时,您需要提供自己的Comparator。 这对你来说应该很简单(它只是一个函数,它接受两个对象,并决定哪一个"先来"),你可以把你想要的任何自定义排序逻辑放在那里。

最新更新