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.
так же, как вы удаляете дубликаты из любого другого ArrayList ...
Например:
tmp.stream().distinct().collect(Collectors.toList());
Примечание: предполагается, что элементы списка реализуют подходящий метод equals
. Как они должны.
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]]
Один из способов сделать это:
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]]