如何在TreeSet或TreeMap中添加ArrayList元素

时间:2016-02-24 21:26:39

标签: java dictionary collections set comparable

众所周知,我们需要实现Comparable接口,并在使用TreeSet时添加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 istances(不是它们的元素)添加到TreeSet或TreeMap?

3 个答案:

答案 0 :(得分:4)

如果你真的需要添加数组列表(作为实例)而不是它的元素,你应该使用另一个构造函数而不是空元素,考虑将constructor作为参数作为比较器。

TreeSet(Comparator<? super E> comparator)

  

构造一个新的空树集,根据指定的比较器进行排序。

您可以为您的目的预先定义一个Comparator,其中包含您对相关的arraylists的实际意义。

然后添加数组列表实例,根据比较器进行正确比较。

例如,您可以定义一个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之间差异的一个很好的例子:

  • 可比较是由您要使用的类实现的,具有特定的行为,您无法更改或添加它
  • Comparator是一个外部实现,您可以添加(如果相关消费者支持)您想要的行为

另请查看this SO Q/A以获取有关可比较与比较器的更多详细信息。

答案 1 :(得分:0)

目前,您正在添加ArrayList对象,而不是其中的元素。如另一个答案中所述,使用addAll将起作用,因为最终它将遍历每个ArrayList并添加单个元素。

答案 2 :(得分:0)

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);