Как поместить дубликаты элементов из списка в массив? - PullRequest
0 голосов
/ 21 января 2019

Мне нужно найти повторяющиеся элементы в коллекции и поместить их в массив.

Я написал этот метод:

String[] mass = new String[(int) limit];

        for (int i = 0; i < duplicates.size(); i++){
            for (int j = 1; j < duplicates.size(); j++){
                if (i != j && duplicates.get(i).equalsIgnoreCase(duplicates.get(j))){
                    mass[j - 1] = duplicates.get(j);
                }
            }

У меня есть эта коллекция:

List<String> duplicates = new ArrayList<>();
        Collections.addAll(duplicates, "java", "JaVa", "mm", "Mama", "ss", "MaMa");

Но когда я отображаю результат на экране, я получаю этот ответ.

JaVa
MaMa
Mama

Что я пропустил?

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Несколько вещей, внутренний цикл просто должен смотреть вперед, поэтому j может начинаться с i+1, и поэтому внешний цикл заканчивается на i < duplicates.size() -1. Тогда вы не можете использовать I или j при назначении на mass, вам нужен отдельный счетчик для этого

int k = 0;
for (int i = 0; i < duplicates.size() -1; i++){
    for (int j = i + 1; j < duplicates.size(); j++){
        if (duplicates.get(i).equalsIgnoreCase(duplicates.get(j))){
            mass[k] = duplicates.get(i);
            k++;
        }
    }
 }
0 голосов
/ 21 января 2019

Если вы хотите сделать это с помощью потоков Java-8

  1. Первый поток List в Map, с ключом String и значениями Long количество вхождений

 Map<String, Long> result =  duplicates.stream().map(String::toLowerCase)
          .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));
  System.out.println(result);    //{ss=1, mm=1, java=2, mama=2}
  1. Затем отфильтруйте, если вхождение больше 1, и соберите его как массив String, код ниже объединяет оба

String[] array = duplicates.stream().map(String::toLowerCase)
          .collect(Collectors.groupingBy(Function.identity(),Collectors.counting()))
          .entrySet().stream().filter(entry->entry.getValue()>1).map(Map.Entry::getKey).toArray(String[]::new);

   System.out.println(Arrays.toString(array));  //[java, mama]
0 голосов
/ 21 января 2019

Я не хочу отдавать это, так как похоже, что ты учишься. Подсказка: вы можете (и, возможно, должны, для практики) выполнить эту задачу за один цикл. Нет необходимости использовать вложенный цикл. Имейте в виду, что вы можете сократить цикл, используя duplicates.size () - 1.

...