Для сжатия в новом списке без повторяющихся элементов могут быть нулевые элементы. Мне нужна помощь .
У меня есть эта ошибка «Ошибка тестера (индивидуальная доставка 4): метод возвращает [] вместо [1] при вызове с [1]».
public <E> PositionList<E> compactar (Iterable<E> lista)
{
if (lista == null){
throw new IllegalArgumentException();
}// if
PositionList<E> newLista = new NodePositionList<E>();
Iterator<E>iterator = lista.iterator();
while(iterator.hasNext())
{
if (eqNull(iterator,iterator.next())) {
newLista.addLast(iterator.next());
}//if
}//while
return newLista;
}//compactar
// ------------- помощник ---------------------------------- ----------------------------
public static boolean eqNull (Object o1, Object o2)
{
return o1 == o2 || o1!= null && o1.equals(o2);
}// de eqNUll
}// Operacioncompactar




Неясно, хотите ли вы удалить все дубли или просто удалить нули. Они удаляют обман.
List<Comparable> l = ...; // The source list
List<Comparable> nl = new ArrayList<>(); // New list without dupes
Collections.sort(l);
Comparable last = UUIDs.randomUUID().toString(); // This one will never be in our source list
for (Comparable c: l) {
if (!Objects.equal(c, last)) { // Or some other null-safe equals function
nl.add(c);
}
last = c;
}
Время работы O (nlogn). Элементы в списке, конечно, нужны для разумной реализации equals() и hashCode().
Set<?> set = new HashSet<String>(); // Track "seen"
List<?> l = ...; // Original list
List<?> nl = new ArrayList<>(); // New list without dupes
for (Object o: l) {
if (!set.contains(o)) {
nl.add(o);
}
set.add(o);
}
Время выполнения - O (n), поскольку hashset - это постоянное время поиска. Или проще:
Set<?> set = new HashSet<String>(); // Will be collection without dupes
List<?> l = ...; // Original list
for (Object o: l) {
set.add(o); // Rely on set semantics to remove dupes
}
List<?> nl = new ArrayList<>(set);
Конечно, объекты в списке должны реализовывать разумные equals() и hashCode().
С java 8 вы можете использовать Stream Different для решения этой проблемы.
Пример кода, как показано ниже. Надеюсь, это поможет тебе.
// input data
List<String> a = new ArrayList<>();
a.add("A");
a.add("A");
a.add("A");
a.add(null);
a.add(null);
Iterator source = a.iterator();
Iterable<String> iterable = () -> source;
// logic code
Iterator temp = StreamSupport
.stream(iterable.spliterator(), false)
.distinct()
.collect(Collectors.toList()).iterator();
Iterable result = () -> temp;
// verify result
StreamSupport
.stream(result.spliterator(), false)
.forEach(System.out::println)
;