Как сравнить элементы массива и добавить соответствующие элементы в третий массив? - PullRequest
0 голосов
/ 05 сентября 2018

Ниже приведен мой код, в котором я хочу сравнить два элемента массива и добавить соответствующие элементы в новый массив (foundArray), а не найденные элементы - в другой массив (notFoundArray).

public static void main(String[] args) {

    Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
    Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };

    List<Integer> foundArray = new ArrayList<Integer>();
    List<Integer> notFoundArray = new ArrayList<Integer>();

    for (int i = 0; i <= originalArray.length; i++) {
        for (int j = 0; j <= keyArray.length; j++) {
            if (originalArray[i] == keyArray[j]) {
                System.out.println("Found");
                foundArray.add(originalArray[i]);
            } else if (originalArray[i] != keyArray[j]) {
                System.out.println("Not Found");
                notFoundArray.add(originalArray[i]);
            }
        }
    }
}

Это не работает. Это дает мне ArrayIndexOutOfBoundsException, а также выполняет только утверждение else. Я нагуглил за это, но нет правильного ответа.

Любая помощь приветствуется. Спасибо!

Ответы [ 7 ]

0 голосов
/ 05 сентября 2018

Если вы заинтересованы в версии Stream, которая просто создает два последних списка целых чисел, этот код сделает это:

    Set<Integer> keys = new HashSet<>(Arrays.asList(keyArray));

    Map<Boolean, List<Integer>> partionedIntegers = Arrays.stream(originalArray).collect(Collectors.partitioningBy(keys::contains));
    List<Integer> foundArray = partionedIntegers.get(true);
    List<Integer> notFoundArray = partionedIntegers.get(false);

Обратите внимание, что это вернет два List<Integer> с отличным Integer, в то время как код в вопросе приведет к двум спискам, содержащим дубликаты.

Более того, этот код будет работать с массивами различной длины.

И ссылаясь на мой комментарий к вопросу:
HashSet.contains будет использовать hashCode и equals, а не идентификатор объекта (==) для определения равенства.

0 голосов
/ 05 сентября 2018

Это также другая версия, использующая Streams.

    Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
    Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };

    List<Integer> foundArray = new ArrayList<>();
    List<Integer> notFoundArray = new ArrayList<>();

    Stream.of(keyArray).forEach(p -> {
            boolean result = Stream.of(originalArray).anyMatch(s -> s.intValue()==p.intValue());
            if(result) {
                foundArray.add(p);
            }else {
                notFoundArray.add(p);
            }
    });
0 голосов
/ 05 сентября 2018

Полагаю, вы хотите сравнить входной массив с массивом ключей, и порядок не важен.

public static void main(String[] args) {

        Set<Integer> originalArray = Arrays.asList(12, 54, 19, 20, 44, 32, 14, 63, 57, 28).stream().collect(Collectors.toSet());
        Set<Integer> keyArray = Arrays.asList(20, 44, 50, 62, 23, 28, 19, 57, 60, 99).stream().collect(Collectors.toSet());

        List<Integer> foundArray = new ArrayList<>();
        List<Integer> notFoundArray = new ArrayList<>();

        for (Integer i : originalArray) {
            if (keyArray.contains(i)) {
                foundArray.add(i);
            } else {
                notFoundArray.add(i);
            }
        }

        System.out.println("Found");
        foundArray.forEach(System.out::println);
        System.out.println("Not found");
        notFoundArray.forEach(System.out::println);
    }
0 голосов
/ 05 сентября 2018
 public static void main(String[] args) {

    Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
    Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };

    List<Integer> foundArray = new ArrayList<Integer>();
    List<Integer> notFoundArray = new ArrayList<Integer>();

    for (int i = 0; i < originalArray.length; i++) {
        for (int j = 0; j < keyArray.length; j++) {
            if (originalArray[i] == keyArray[j]) {
                System.out.println("Found");
                foundArray.add(originalArray[i]);
            }
        }
    }
}

Это не вызовет ArrayOfOfBoundsException и даст вам все найденные элементы. Чтобы получить найденные элементы, просто возьмите один массив и сравните его с 'foundArray'.

0 голосов
/ 05 сентября 2018

Есть несколько проблем (<= вместо <и логика). Это должно работать: </p>

public static void main(String[] args) {

    Integer[] originalArray = { 12, 54, 19, 20, 44, 32, 14, 63, 57, 28 };
    Integer[] keyArray = { 20, 44, 50, 62, 23, 28, 19, 57, 60, 99 };

    List<Integer> foundArray = new ArrayList<Integer>();
    List<Integer> notFoundArray = new ArrayList<Integer>();

    for (int i = 0; i < originalArray.length; i++) {
        boolean found = false;

        for (int j = 0; j < keyArray.length; j++) {
            if (originalArray[i] == keyArray[j]) {
                System.out.println("Found");
                foundArray.add(originalArray[i]);
                found = true;
                break;
            }
        }

        if(found == false) {
            System.out.println("Not Found");
            notFoundArray.add(originalArray[i]);
        }
    }
}
0 голосов
/ 05 сентября 2018

Я вижу две проблемы с вашим кодом. Во-первых, границы вашего цикла неверны, потому что массив размером N может быть адресован только до N-1. Во-вторых, и, возможно, более важно, вы должны вести бухгалтерию для каждого номера оригинала после внутреннего цикла сканирования по значениям поиска, а не внутри него. Принимая во внимание оба из них:

for (int i=0; i < originalArray.length; i++) {
    boolean found = false;
    for (int j=0; j < keyArray.length; j++) {
        if (originalArray[i] == keyArray[j]) {
            System.out.println("Found");
            found = true;
            break;
        }
    }

    if (found) {
        foundArray.add(originalArray[i]);
    }
    else {
        notFoundArray.add(originalArray[i]);
    }
}

В вашем текущем подходе вы добавляете один и тот же начальный номер несколько раз в две коллекции. Скорее всего, вы не хотите такого поведения.

0 голосов
/ 05 сентября 2018

Последний индекс массива ann равен length-1, так как первый индекс равен нулю, поэтому ваш код должен быть

for (int i = 0; i < originalArray.length; i++) {
    for (int j = 0; j < keyArray.length; j++) {
...