Поиск общих элементов между двумя массивами строк (даже дубликатов)

#java #discord

#java #Discord

Вопрос:

Хорошо, итак, я создаю discord-бота, и я тупой.
Итак, если решение игры таково: [«:star:», «:star:», «:star:», «:star:»]
И я ввожу [«:star:»,»:clubs:», «:star:», «:star:»]

Мне нужно, чтобы общий массив строк был: [«:star:»,»:star:»,»:star:»]

Это то, что я пробовал:

   private List<String> findCommonElement(String[] a, String[] b) {

        List<String> commonElements = new ArrayList<>();

        for (String s1 : a) {
            for (String s2 : b) {
                if (s1.equals(s2)) {
                    commonElements.add(s1);
                    break;
                }
            }
        }
        return commonElements;
    }
  

Я понимаю, что он проверяет положение каждого элемента с положением других массивов, но я не знаю. Сделать его не вложенным?

Комментарии:

1. что не так с тем, как вы это делаете? Каков ваш фактический результат?

2. Решение: [:звезда:, : звезда:, : звезда:, : звезда:] Мой вклад: [: звезда:, : клубы:, : клубы:, : клубы:] Одинаковые элементы: [:звезда:, : звезда:, : звезда:, :звезда:] Независимо от того, сколько одинаковых элементов содержит мой ввод, он будет равен 4.

3. итак, вы пытаетесь сопоставить a[0] с b[0] , a[1] с b[1] , a[2] с b[2] и т.д.?

4. Всегда ли входной массив и решение будут одинаковой длины? Также вы пытаетесь сравнить строки в каждом массиве по каждому индексу (т. Е. a[0].equals(b[0]), а следующая итерация — a[1].equals(b[1]);)?

5. @ScaryWombat Нет, другой пример решения: [:трефы: , : сердца:, : сердца:, : звезда:] Мой вклад: [: сердца:, : трефы:, : звезда:, : сердца:] Те же элементы: [: сердца:, : трефы:, : сердца:, : звезда:]. Таким образом, в этом случае позиции элементов не совпадают, но строки совпадают.

Ответ №1:

Используйте Set, и это предотвратит добавление повторяющихся значений

     Set<String> commonElements = new HashSet<>();

    for (String s1 : a) {
        for (String s2 : b) {
            if (s1.equals(s2)) {
                commonElements.add(s1);
                break;
            }
        }
    }
    return commonElements;
  

Комментарии:

1. Да, но мне нужны дубликаты.

Ответ №2:

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

  private List<String> findCommonElement2(String[] a, String[] b) {

    List<String> commonElements = new ArrayList<>();

    for(int i = 0; i < a.length; i  ) {
        for(int x = 0; x < b.length; x  ) {

            if(a[i].equals(b[x])) {
                commonElements.add(a[i]);
                b[x] = "ignore";
                break;
            }                               
        }

    }

    return commonElements;
}