недостающие элементы из двух массивов в Java - PullRequest
4 голосов
/ 05 февраля 2010

Как мы можем обнаружить недостающие элементы из двух массивов? Пример:

        int []array1 ={1,2,3,4,5};           
        int []array2 ={3,1,2};

Из двух приведенных выше массивов я хочу узнать, какие недостающие элементы есть во втором массиве?

Ответы [ 9 ]

4 голосов
/ 05 февраля 2010

Преобразуйте их в Set с и используйте removeAll.

Первая проблема заключается в том, как преобразовать примитив int[] в коллекцию. С Гуава вы можете использовать:

List<Integer> list1 = Ints.asList(array1);
List<Integer> list2 = Ints.asList(array2);

Apache commons (с которым я не знаком), по-видимому, имеет нечто подобное.

Теперь преобразовать в набор:

Set<Integer> set1 = new HashSet<Integer>(list1);

И вычислите разницу:

set1.removeAll(list2);

И преобразовать результат обратно в массив:

return Ints.toArray(set1);
2 голосов
/ 05 февраля 2010

Если вам разрешены дубликаты в массивах, эффективное (O (n)) решение - создать таблицу частот (Map) путем итерации по первому массиву, а затем использовать карту для сопоставления любых элементов во втором массив.

Map<Integer, Integer> freqMap = new HashMap<Integer, Integer>();

// Iterate over array1 and populate frequency map whereby
// the key is the integer and the value is the number of
// occurences.
for (int val1 : array1) {
  Integer freq = freqMap.get(val1);

  if (freq == null) {
    freqMap.put(val1, 1);
  } else {
    freqMap.put(val1, freq + 1);
  }
}

// Now read the second array, reducing the frequency for any value
// encountered that is also in array1.
for (int val2 : array2) {
  Integer freq = freqMap.get(val2);

  if (freq == null) {
    freqMap.remove(val2);
  } else {
    if (freq == 0) {
      freqMap.remove(val2);   
    } else {
      freqMap.put(freq - 1);
    }
  }
}

// Finally, iterate over map and build results.
List<Integer> result = new LinkedList<Integer>();

for (Map.Entry<Integer, Integer> entry : freqMap.entrySet()) {
  int remaining = entry.getValue();

  for (int i=0; i<remaining; ++i) {
    result.add(entry.getKey());
  }
}

// TODO: Convert to int[] using the util. method of your choosing.
0 голосов
/ 29 мая 2014

Это не самый эффективный способ, но, вероятно, самый простой способ, который работает в Java:

public static void main(final String[] args) {
        final int[] a = { 1, 2, 3, 4, 5 };
        final int[] b = { 3, 1, 2 };
        // we have to do this just in case if there might some values that are missing in a and b
        // example: a = { 1, 2, 3, 4, 5 }; b={ 2, 3, 1, 0, 5 }; missing value=4 and 0
        findMissingValue(b, a);
        findMissingValue(a, b);
    }

    private static void findMissingValue(final int[] x, final int[] y) {
        // loop through the bigger array
        for (final int n : x) {
            // for each value in the a array call another loop method to see if it's in there
            if (!findValueSmallerArray(n, y)) {
                System.out.println("missing value: " + n);
                // break;
            }
        }
    }

    private static boolean findValueSmallerArray(final int n, final int[] y) {
        for (final int i : y) {
            if (n == i) {
                return true;
            }
        }
        return false;
    }
0 голосов
/ 17 сентября 2013

библиотека гуавы может быть полезна; вам нужно изменить массив в наборе, затем можете использовать API.

0 голосов
/ 05 февраля 2010

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

Возможно, это не самый «эффективный» способ, но это очень простая концепция, которая работает.

0 голосов
/ 05 февраля 2010

@ finnw Полагаю, вы думали о фондах-коллекциях . Необходимо импортировать org.apache.commons.collections.CollectionUtils; Чтобы получить функцию дизъюнкции.

При использовании метода дизъюнкция будут найдены все объекты, которые не найдены на пересечении .

Integer[] array1 ={1,2,3,4,5};           
Integer[] array2 ={3,1,2};
List list1 = Arrays.asList(array1);
List list2 = Arrays.asList(array2);
Collection result = CollectionUtils.disjunction(list1, list2);
System.out.println(result); // displays [4, 5]
0 голосов
/ 05 февраля 2010

Рассмотрим использование метода пересечения:

Здоровая дискуссия доступна по адресу:

http://www.coderanch.com/t/35439/Programming-Diversions/Intersection-two-arrays

0 голосов
/ 05 февраля 2010

Наивным способом было бы просто искать в одном массиве каждый из элементов другого массива (с помощью цикла for). Если вы сначала отсортировали оба массива, это станет намного эффективнее.

0 голосов
/ 05 февраля 2010

Вы можете использовать Set и его методы. Эта операция будет установленной разницей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...