【发布时间】:2015-10-27 04:35:39
【问题描述】:
我需要将两个相同类型的对象列表添加到一个 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
如您所见,输出的List 1 中不存在第二个B B1,因为list 1 上有两个B B1。
同样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 的自然顺序?
【问题讨论】:
-
自然秩序是什么意思?
-
@Codebender 我的意思是它们被添加到集合中的顺序。请查看我在问题中的示例输出列表。
-
好吧,你上面提供的数据结构不是一个列表……不知道为什么你一直把它称为一个列表。提供“列表”的完整实现,显示您如何向其中添加内容
-
@Smac89 它们都是 ArrayLists,问题已更新。