Удалить дубликаты из ArrayList Наборов | ArrayList & л; Комплект & л; Строка > > TMP [дубликат]

Java ClassCastException - это исключение, которое может возникнуть при попытке неправильно преобразовать класс из одного типа в другой.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ClassCastExceptionExample {

  public ClassCastExceptionExample() {

    List list = new ArrayList();
    list.add("one");
    list.add("two");
    Iterator it = list.iterator();
    while (it.hasNext()) {
        // intentionally throw a ClassCastException by trying to cast a String to an
        // Integer (technically this is casting an Object to an Integer, where the Object 
        // is really a reference to a String:
        Integer i = (Integer)it.next();
    }
  }
 public static void main(String[] args) {
  new ClassCastExceptionExample();
 }
}

Если вы попытаетесь запустить эту программу Java, вы увидите, что она выдает следующее ClassCastException:

Exception in thread "main" java.lang.ClassCastException: java.lang.String
at ClassCastExceptionExample  (ClassCastExceptionExample.java:15)
at ClassCastExceptionExample.main  (ClassCastExceptionExample.java:19)

Причина, по которой возникает исключение, заключается в том, что когда я создаю свой объект списка, объект, который я храню в списке, является строкой «один», но затем позже, когда я попытаюсь вытащить этот объект, я намеренно совершу ошибку, пытаясь передать его в Integer. Поскольку String не может быть напрямую применена к Integer - целое не является типом String - генерируется исключение ClassCastException.

1
задан hsnsd 28 March 2019 в 03:57
поделиться

3 ответа

так же, как вы удаляете дубликаты из любого другого ArrayList ...

Например:

tmp.stream().distinct().collect(Collectors.toList());

Примечание: предполагается, что элементы списка реализуют подходящий метод equals. Как они должны.

0
ответ дан Patrick Parker 28 March 2019 в 03:57
поделиться

HashSet работает над алгоритмом хеширования,

Так что, если у вас есть два набора String , которые содержат одинаковое значение, тогда хеш-код этого набора всегда будет одинаковым (поскольку String имеет специальное распределение в Яве).

Так что вы можете попробовать, как показано ниже.

    List<Set<String>> tmp = new ArrayList<Set<String>>();
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"A","B","C"})));
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"B","A","C"})));
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"C","D","E"})));
    tmp.add(new HashSet<>(Arrays.asList(new String[]{"E","C","D"})));

    List<Set<String>> list =new ArrayList<>();

    for(Set<String> s: tmp){
        if(!list.contains(s)){
            list.add(s);
        }
    }
    System.out.println(list);

Результат будет похож на

[[A, B, C], [C, D, E]]
0
ответ дан Alpesh Jikadra 28 March 2019 в 03:57
поделиться

Один из способов сделать это:

    List<Set<String>> tmp = new ArrayList<>();
    tmp.add(new HashSet<>(List.of("A", "B", "C")));
    tmp.add(new HashSet<>(List.of("B", "A", "C")));
    tmp.add(new HashSet<>(List.of("C", "D", "E")));
    tmp.add(new HashSet<>(List.of("E", "C", "D")));

    Iterator<Set<String>> it = tmp.iterator();
    while (it.hasNext())
    {
        Set<String> currentSet = it.next();

        for (Set<String> set : tmp)
        {
            if (currentSet != set
                    && currentSet.containsAll(set)
                    && currentSet.size() == set.size())
            {
                it.remove();
                break;
            }
        }
    }

    System.out.println(set);

Вывод:

[[A, B, C], [C, D, E]]
0
ответ дан Ealrann 28 March 2019 в 03:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: