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

Ari*_*pta 2 java collections dictionary set comparable

众所周知,在使用TreeSet时,我们需要实现Comparable接口并添加compareTo()。不这样做将会抛出 ClassCastException。现在我有一个 TreeSet,我需要添加 ArrayList 作为 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);
Run Code Online (Sandbox Code Playgroud)

它抛出 ClassCastException。

问题:如何将 ArrayList 实例(而不是其元素)添加到 TreeSet 或 TreeMap?

A_D*_*teo 5

如果您确实需要添加数组列表(作为实例)而不是其元素,则应该使用另一个构造函数而不是空构造函数,请考虑Comparator 作为参数的构造函数。

TreeSet(Comparator<? super E> 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

    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);
Run Code Online (Sandbox Code Playgroud)

请注意

TreeSet ts = new TreeSet(new MyArrayListComparator());
Run Code Online (Sandbox Code Playgroud)

这实际上是 Comparable 和 Comparator 之间差异的一个很好的例子:

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

另请查看此 SO Q/A,了解有关可比较与比较器的更多详细信息。