如何在 TreeSet 或 TreeMap 中添加 ArrayList 元素
How to add ArrayList elements in TreeSet or TreeMap
众所周知,我们在使用TreeSet时,需要实现Comparable接口并添加compareTo()。不这样做会抛出 ClassCastException。
现在我有一个 TreeSet,我需要添加 ArrayLists 作为 TreeSet 的元素。
如果我们写:
ArrayList al = new ArrayList();
ArrayList al2 = new ArrayList();
ArrayList al3 = new ArrayList();
TreeSet ts = new TreeSet();
ts.add(al);
ts.add(al2);
ts.add(al3);
它抛出 ClassCastException。
问题:如何将 ArrayList 实例(不是它们的元素)添加到 TreeSet 或 TreeMap?
如果你真的需要添加数组列表(作为一个实例)而不是它的元素,你应该使用另一个构造函数而不是空的构造函数,考虑 constructor 将比较器作为参数。
TreeSet(Comparator<? super E> comparator)
Constructs a new, empty tree set, sorted according to the specified comparator.
您可以预先定义一个 Comparator 用于您的目的,其中包含您对相关数组列表的实际需要的含义。
然后添加数组列表实例,这将根据您的比较器进行适当的比较。
例如,您可以定义一个比较器,它会根据数组列表的大小来比较数组列表(示例简单比较):
public class MyArrayListComparator implements java.util.Comparator<ArrayList> {
public int compare(ArrayList al1, ArrayList al2) {
if (al1.size() > al2.size())
return 1;
if (al1.size() < al2.size())
return -1;
return 0;
}
}
然后在你的代码中:
ArrayList al = new ArrayList();
ArrayList al2 = new ArrayList();
ArrayList al3 = new ArrayList();
TreeSet ts = new TreeSet(new MyArrayListComparator());
ts.add(al);
ts.add(al2);
ts.add(al3);
注意
TreeSet ts = new TreeSet(new MyArrayListComparator());
这实际上是 Comparable 和 Comparator 之间区别的一个很好的例子:
- Comparable 由您要使用的 class 实现,具有特定的行为,您无法更改或添加它
- 比较器是一个外部实现,您可以添加(如果相关消费者支持)您想要的行为
另请检查 this SO Q/A 以了解有关 Comparable 与 Comparator 的更多详细信息。
目前您正在添加 ArrayList 对象,而不是其中的元素。如另一个答案中所述,使用 addAll 将起作用,因为最终它将遍历每个 ArrayList 并添加各个元素。
1) 如前所述,您将 ArrayList 添加到 TreeSet,而不是 ArrayList 中的元素。
al.add(__something__);
ts.add(al.get(__something-to-get-your-element-from-al__));
2) 不建议使用原始类型,因为 Lists 和 Sets 是通用类型:
List<String> al = new ArrayList();
Set<String> ts = new TreeSet();
al.add("hello");
al.add("hello2");
ts.add(al.get(0));
ts.add(al.get(1));
或:
ts.addAll(al); //which will add to your TreeSet all the elements that are in the ArrayList.
编辑:3) 可能您想将 ArrayList 添加到 TreeSet,然后您必须像这样声明集合:
List<String> al = new ArrayList();
//add elements to al
Set<List<String>> ts = new TreeSet();
ts.add(al);
众所周知,我们在使用TreeSet时,需要实现Comparable接口并添加compareTo()。不这样做会抛出 ClassCastException。 现在我有一个 TreeSet,我需要添加 ArrayLists 作为 TreeSet 的元素。
如果我们写:
ArrayList al = new ArrayList();
ArrayList al2 = new ArrayList();
ArrayList al3 = new ArrayList();
TreeSet ts = new TreeSet();
ts.add(al);
ts.add(al2);
ts.add(al3);
它抛出 ClassCastException。
问题:如何将 ArrayList 实例(不是它们的元素)添加到 TreeSet 或 TreeMap?
如果你真的需要添加数组列表(作为一个实例)而不是它的元素,你应该使用另一个构造函数而不是空的构造函数,考虑 constructor 将比较器作为参数。
TreeSet(Comparator<? super E> comparator)
Constructs a new, empty tree set, sorted according to the specified comparator.
您可以预先定义一个 Comparator 用于您的目的,其中包含您对相关数组列表的实际需要的含义。
然后添加数组列表实例,这将根据您的比较器进行适当的比较。
例如,您可以定义一个比较器,它会根据数组列表的大小来比较数组列表(示例简单比较):
public class MyArrayListComparator implements java.util.Comparator<ArrayList> {
public int compare(ArrayList al1, ArrayList al2) {
if (al1.size() > al2.size())
return 1;
if (al1.size() < al2.size())
return -1;
return 0;
}
}
然后在你的代码中:
ArrayList al = new ArrayList();
ArrayList al2 = new ArrayList();
ArrayList al3 = new ArrayList();
TreeSet ts = new TreeSet(new MyArrayListComparator());
ts.add(al);
ts.add(al2);
ts.add(al3);
注意
TreeSet ts = new TreeSet(new MyArrayListComparator());
这实际上是 Comparable 和 Comparator 之间区别的一个很好的例子:
- Comparable 由您要使用的 class 实现,具有特定的行为,您无法更改或添加它
- 比较器是一个外部实现,您可以添加(如果相关消费者支持)您想要的行为
另请检查 this SO Q/A 以了解有关 Comparable 与 Comparator 的更多详细信息。
目前您正在添加 ArrayList 对象,而不是其中的元素。如另一个答案中所述,使用 addAll 将起作用,因为最终它将遍历每个 ArrayList 并添加各个元素。
1) 如前所述,您将 ArrayList 添加到 TreeSet,而不是 ArrayList 中的元素。
al.add(__something__);
ts.add(al.get(__something-to-get-your-element-from-al__));
2) 不建议使用原始类型,因为 Lists 和 Sets 是通用类型:
List<String> al = new ArrayList();
Set<String> ts = new TreeSet();
al.add("hello");
al.add("hello2");
ts.add(al.get(0));
ts.add(al.get(1));
或:
ts.addAll(al); //which will add to your TreeSet all the elements that are in the ArrayList.
编辑:3) 可能您想将 ArrayList 添加到 TreeSet,然后您必须像这样声明集合:
List<String> al = new ArrayList();
//add elements to al
Set<List<String>> ts = new TreeSet();
ts.add(al);