我需要向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的自然顺序?
答案 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