Сравнить все элементы между массивами и вернуть все возможные совпадения - PullRequest
1 голос
/ 10 марта 2019

Я пытаюсь создать функцию, которая сравнивает все элементы массива со всеми элементами второго массива и возвращает все возможные совпадения, а также сообщение, если совпадений не найдено. Когда я пытаюсь реализовать код, я получаю индекс из связанной ошибки. Внутренний цикл for, вероятно, исчерпан, прежде чем внешний цикл for сможет завершить работу. Как мне изменить его, чтобы предотвратить возникновение такого сценария?

Stocks[] stockList3 = new Stocks[3];
stockList3[0] = new Stocks("a", 2, 1, "Buy");
stockList3[1] = new Stocks("a", 3, 1, "Buy");
stockList3[2] = new Stocks("a", 4, 1, "Buy");

Stocks[] stockList4 = new Stocks[3];
stockList4[0] = new Stocks("a", 2, 1, "Buy");
stockList4[1] = new Stocks("a", 5, 1, "Buy");
stockList4[2] = new Stocks("a", 4, 1, "Buy");

public void matching(Stocks[] array1, Stocks[] array2) {
    for (int i = 0; i < array1.length; i++) {
        for (int j = 0; i < array2.length; j++) {
            if (array1[i].stockPrice == array2[j].stockPrice) {
                System.out.println("It's a match at $" + array1[i].stockPrice);
            }
            System.out.println("still searching...");
        }
        System.out.println("first loop test...");
    }
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

А что вместо двух for loops, использовать Set коллекцию для хранения существующего stockPrices для одного из массивов?

public static List<Stocks> matching(Stocks[] one, Stocks[] two) {
    Set<Integer> stockPrices = Arrays.stream(one)
                                     .map(stock -> stock.stockPrice)
                                     .collect(Collectors.toSet());
    return Arrays.stream(two)
                 .filter(stock -> stockPrices.contains(stock.stockPrice))
                 .collect(Collectors.toList());
}

Используется O (n) дополнительная память (где n равно one.length ) с O (n + m) время выполнения (где m равно two.length ).

0 голосов
/ 10 марта 2019

В вашем J-цикле вы говорили i<array2.length вместо j<array2.length

public void matching ( Stocks[] array1, Stocks[] array2){
    for (int i=0; i<array1.length;i++){

        for (int j=0;
                 j<array2.length;  //this j was an i
                 j++){

            if (array1[i].stockPrice == array2[j].stockPrice){
                System.out.println("It's a match at $" + array1[i].stockPrice);



            }
            System.out.println("still searching...");
        }
        System.out.println("first loop test...");   
    }

}
...