Сравните два массива с разным порядком - PullRequest
0 голосов
/ 15 февраля 2019

Я новичок в кодировании, и я решил изучать Java, отличный.Я делаю простое упражнение.Я получил два массива, и я должен сравнить их, если они равны.Я беру значения из базы данных 2 и эти базы данных одинаковы, но значения не в том же порядке, но они равны.Например, у меня есть:

ArrayList collection1 = ["test","a"]
ArrayList collection2 = ["a","test"]

Ну, я попробовал это:

assert collection1.equals(collection2)

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

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

В Groovy просто отсортируйте их и проверьте отсортированные списки:

assert listA.sort(false) == listB.sort(false)

Или, если они не могут иметь дубликаты, используйте наборы, как предложено @ Baldwin

0 голосов
/ 15 февраля 2019

Я могу подумать о двух методах:

  1. Убедитесь, что они равны по размеру
  2. Оберните два массива с помощью Arrays.asList()
  3. Проверьте, если aсодержит все элементы из b
public static boolean equals(Object[] a, Object[] b) {
    return a.length == b.length && Array.asList(a).containsAll(Arrays.asList(b));
}

Другой способ - просто выполнить итерацию по обоим массивам одновременно, а затем проверить, равны ли элементы:

public static boolean equals(Object[] a, Object[] b) {
    if(a.length != b.length) return false;
    outer: for(Object aObject : a) {
         for(Object bObject : b) {
              if(a.equals(b)) continue outer;
         }
         return false;
    }
    return true;
}

Обаметоды довольно быстрые, первый вводит дополнительную обертку вокруг массивов, но пренебрежимо мал, поскольку Arrays.asList() просто использует данный массив как представление и не выполняет никакого дополнительного копирования.


Теперь кажетсячто вы на самом деле сравниваете два Collection с, то вы можете просто использовать этот подход:

public static boolean equals(Collection<?> a, Collection<?> b) {
     return a.size() == b.size() && a.containsAll(b);
}
0 голосов
/ 15 февраля 2019

Я абсолютно уверен в программировании на Java, но некоторое время я думал об этой проблеме более широко, и я думаю, что у меня есть работоспособное решение, которое можно обобщить, если вы знаете a priori все значения, которыеможет содержаться в массиве.

Если вы назначите простое число каждой возможной строке, которая может быть в массиве, а затем умножите все элементы массива вместе, то умноженное число будет представлять собой уникальную комбинацию,но не порядок, или элементы массива.Чтобы замкнуть цикл, нужно просто сравнить значения этого умножения.Если есть лучший ответ, используйте его, но я подумал, что поделюсь этой идеей.

0 голосов
/ 15 февраля 2019

В массиве важен порядок.Если вам нужен массив без проверки порядка, вы должны использовать Sets Sets tutorial .

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

Надеюсь, это поможет!

...