Как мы все знаем, нам нужно реализовать интерфейс Comparable и добавить compareTo (), когда мы работаем с TreeSet. В противном случае возникнет исключение 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?

1
Arijit Dasgupta 25 Фев 2016 в 00:26

3 ответа

Лучший ответ

Если вам действительно нужно добавить список массивов (как экземпляр), а не его элементы, вам следует использовать другой конструктор, а не пустой, рассмотрите constructor, принимающий в качестве параметра Comparator.

TreeSet(Comparator<? super E> 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 реализуется классом, который вы хотите использовать, с определенным поведением, и вы не можете его изменить или добавить.
  • Компаратор - это внешняя реализация, которую вы можете добавить (если поддерживается заинтересованным потребителем) с желаемым поведением.

См. Также этот SO Q / A для получения дополнительных сведений о Comparable vs Comparator.

4
Community 23 Май 2017 в 11:45

В настоящее время вы добавляете объекты ArrayList, а не элементы внутри них. Как описано в другом ответе, использование addAll будет работать, потому что в конечном итоге он пройдет через каждый ArrayList и добавит отдельные элементы.

0
Trace Carrasco 24 Фев 2016 в 21:31

1) Как было сказано ранее, вы добавляете ArrayList в TreeSet, а не элемент внутри ArrayList.

al.add(__something__);
ts.add(al.get(__something-to-get-your-element-from-al__));

2) Не рекомендуется использовать необработанные типы, поскольку списки и наборы являются общими типами:

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);
0
Lorenzo Barbagli 24 Фев 2016 в 21:44