Найти общие элементы между двумя строковыми массивами (даже дубликаты) - PullRequest
0 голосов
/ 23 апреля 2019

Хорошо, я делаю бот-дискорд, и я тупой.
Так что, если решение игры таково: [": 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;
    }

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

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

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

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

    for (String s1 : a) {
        for (String s2 : b) {
            if (s1.equals(s2)) {
                commonElements.add(s1);
                break;
            }
        }
    }
    return commonElements;
0 голосов
/ 23 апреля 2019

В условии if перед установкой разрыва вы можете просто изменить массив b в этой позиции на другую строку, что приведет к тому, что условие if будет ложным для этой позиции в массиве 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;
}    
...