java.lang.ClassCastException:List无法强制转换为java.lang.Comparable

时间:2015-10-27 04:35:39

标签: java arraylist set

我需要向SET添加两个相同类型的对象列表。我应该确保集合的顺序是自然顺序,并且SET中有无法修复

我读了this question的答案,但没有用。

例如,我的输入和输出应如下所示

清单1

A A1 List1
B B1 List1
B B1 List1

清单2

C C1 List2
D D1 List2
A A1 List2

输出

List1
A A1
B B1
List2
C C1
D D1

您可以看到输出的B B1中不存在第二个List 1,因为B B1上有两个list 1

A A1输出中也不存在list 2,因为它已存在于输出的List 1中。

还保留每个列表的顺序。 (列表1首先被添加,因此列表1位于列表的顶部,在列表2之后,并且保留了所有元素的顺序。)

public class MyList{
    private String name;
    private String code;
    private String group;

    //setters and getters
}

List<MyList> list1 = new ArrayList<MyList>();
List<MyList> list2 = new ArrayList<MyList>();
....
Set<MyList> output = new TreeSet<MyList>();
output.addAll(list1);
output.addAll(list2);

抛出的异常

java.lang.ClassCastException: com.myproject.MyList cannot be cast to java.lang.Comparable
    at java.util.TreeMap.compare(TreeMap.java:1290)
    at java.util.TreeMap.put(TreeMap.java:538)
    at java.util.TreeSet.add(TreeSet.java:255)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
    at java.util.TreeSet.addAll(TreeSet.java:312)

为了解决这个问题,我将Comparable添加到MyList类,但它改变了SET的顺序。如何保持SET的自然顺序?

5 个答案:

答案 0 :(得分:4)

如果您想要Set维护广告订单,那么您正在寻找的班级是LinkedHashSet

实现是一个哈希表,它还维护一个链接的条目列表,允许您按照添加顺序迭代条目。

答案 1 :(得分:1)

&#34;自然顺序&#34; TreeSet 的实现是通过MyList.class中的 compareTo()实现的。因为TreeSet不知道如何订购你的对象,但它必须这样做。 如果您需要通过&#34;它们被添加到集合&#34; - 使用 LinkedHashSet

答案 2 :(得分:0)

仅在名称和代码上创建equals和hashcode。您还可以创建一个维持原始订单的比较方法。

答案 3 :(得分:0)

  

如何保持SET的自然顺序?

List是为此而设的,而不是set,Set不是有序的,但TreeSet仅在您根据指定的比较器定义Comparator时进行排序。否则TreeSet不知道它应该保存对象的顺序。

获取一个列表,它将为您提供所需的输出。

答案 4 :(得分:0)

如果你需要使用TreeSet,你必须使用Compartor或Comparable扩展你的类mylist,hashset不能保证顺序,任何需要以原始/包装类型以外的方式排序/排序的对象需要显式方式告诉JVM如何对它们进行排序,否则JVM将无法知道它必须在对象中排序哪个属性,因此错误java.lang.ClassCastException:com.myproject.MyList无法强制转换为java.lang.Comparable