Как удалить идущие подряд дубликаты в списке(заменить их 1 вхождением)?
Необходима функция которая из списка чисел создаст новый список, в котором подряд идущие одинаковые числа будут заменены одним вхождением, например: { 2, 11, 11, 11, 2, 3, 2, 2, 6, 6, 2, 3, 3, 3, 10 } → { 2, 11, 2, 3, 2, 6, 2, 3, 10 } Есть функция, которая удаляет вообще все дубликаты. Как её переделать?
public static List<Integer> createNewList(List<Integer> list) {
for (int i = list.size() - 1; i > -1; i--)
if (list.indexOf(list.get(i)) != i) list.remove(i);
return list;
}
вывод: { 2, 11, 3, 6, 10 }
Ответы (2 шт):
Автор решения: had0uken
→ Ссылка
Плохая идея: удалять элементы в листе, по которому вы иттерируетесь. Создайте новый лист (у вас же метод называется "создать новый лист") и добавляйте в него нужные элементы:
public static List<Integer> createNewList(List<Integer> list) {
List<Integer> result = new ArrayList<>();
result.add(list.get(0)); // 0 элемент в любом случае попадает
for(int i=1;i<list.size();i++)
if(list.get(i)!=list.get(i-1))result.add(list.get(i));
//если элемент листа не равен предыдущему - добавляем в
//результат, иначе идем дальше
return result;
}
Автор решения: Gug1n16
→ Ссылка
Через удаление лишних элементов почти получилось сделать , только нужно дабавить условие на случай, если больше 2 одинаковых символов подряд.
public static List<Integer> createNewList(List<Integer> list) {
for (int i = 0; i < list.size() - 1; i++){
if (list.get(i) == list.get(i + 1)){
list.remove(i+1);
}
}
return list;
}
Вывод: 2 11 11 2 3 2 6 2 3 3 10