Как удалить все дубликаты из списка - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь удалить все повторяющиеся элементы из списка, не используя set, и элементы должны оставаться в порядке.

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

Любое предложение будет полезно.

Код:

public class DuplicatesCheck {

    public static void main(String[] args) {
          System.out.println("Enter elements:");
          Scanner scan = new Scanner(System.in);
          String input = scan.nextLine();
          List<String> elements = new ArrayList<String>(Arrays.asList(input.split(",")));
          List<String> elements2 = new ArrayList<String>();
          elements2 = elements;

         for(int i = 0; I < elements.size() - 1 ; i++ ) {
             for(int j = i + 1; j < elements.size(); j++) {             
                if(elements.get(i).equals(elements.get(j))) {                           
                    elements2.remove(j);                     
                }
             }
         }
         System.out.println(elements2);
    }
}

Ответы [ 3 ]

3 голосов
/ 26 апреля 2020

Самый простой способ - это тоже использовать отлично () от потокового API:

List<String> distinct = elements.stream()
    .distinct()
    .collect(Collectors.toList())
1 голос
/ 26 апреля 2020

Не взаимодействовать с индексом. Потому что после удаления элемента elements.size () уменьшается на 1. Поэтому j ++ пропустит элемент. Следовательно, используйте итерацию foreach или инкремент j, только если они не удалены. Если удалить ваш J указывает только на следующий элемент. Потому что когда элемент удаляется из списка, остальные элементы сдвигаются влево.

Надеюсь, это поможет. Я могу опубликовать полное решение, если вам нужно.

0 голосов
/ 26 апреля 2020

Вместо удаления элемента из elements2 добавьте элемент в elements2, если он отсутствует в нем.

Демонстрация:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println("Enter elements:");
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        List<String> elements = new ArrayList<String>(Arrays.asList(input.split(",")));
        List<String> elements2 = new ArrayList<String>();
        for (String str : elements) {
            if (!elements2.contains(str)) {
                elements2.add(str);
            }
        }
        System.out.println(elements2);
    }
}

Пробный прогон:

Enter elements:
a,b,a,c,b,d,a,c,b
[a, b, c, d]

Другой пробный прогон:

Enter elements:
b,a,b,c,a,d,f,a,e
[b, a, c, d, f, e]
...