2013-11-26 6 views
2

У меня есть массив массивных массивов, и я хочу пройти через каждый массив из 1-го и сравнить его со всеми предыдущими массивами в arraylist. Если массив равен любому из предыдущих массивов, тогда программа должна выводить «повтор» и останавливать программу. Кроме того, есть ли способ сортировки массивов, чтобы программа работала быстрее и эффективнее? Заранее спасибо.Сортировка и сопоставление массива массивов целых массивов в Java

Пример

Arraylist<int[]> numbers = new Arraylist<int[]>(); 

    int[] num1 = new int[]{1,2,3}; 
    int[] num2 = new int[]{2,3,5}; 
    int[] num3 = new int[]{1,2,3}; 
    int[] num4 = new int[]{3,2,6}; 

numbers.add(num1); 
numbers.add(num2); 
numbers.add(num3); 
numbers.add(num4); 

(Sorting to make more efficient and faster) 

(Comparing) 

Программа должна вывести «повторить» и прекратить после того, как он сравнивает num3 с num1, потому что они одинаковы.

ответ

2

Поместите свои массивы в небольшую обертку, которая реализует hashCode() и equals(). Затем поместите их в HashSet, используя метод add(). Если метод add возвращает false, у вас есть дубликат.

Вы можете использовать Arrays.hashCode для возвращаемого значения hashCode() и Arrays.equals(array1, array2) для реализации equals().

Единственное, что впоследствии создать список, нужно будет извлечь объекты из Set, получить массив байтов и поместить его в список. Вы можете использовать List.addAll(), чтобы поместить объекты оболочки в список. Но, возможно, вы хотите сохранить Set, в зависимости от дальнейшего использования.


ОК, так что, возможно, это немного продвинутый, я сделал реализацию для вас:

public class Dupes { 

    public static class WrappedArray { 
     public WrappedArray(int[] wrapped) { 
      this.wrapped = wrapped; 
     } 

     public int[] getWrapped() { 
      return this.wrapped; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (!(obj instanceof WrappedArray)) { 
       return false; 
      } 
      WrappedArray that = (WrappedArray) obj; 
      return Arrays.equals(this.wrapped, that.wrapped); 
     } 

     @Override 
     public int hashCode() { 
      return Arrays.hashCode(wrapped); 
     } 

     private final int[] wrapped; 
    } 

    public static void main(String[] args) { 
     List<int[]> numbers = new ArrayList<int[]>(); 

     int[] num1 = new int[] { 1, 2, 3 }; 
     int[] num2 = new int[] { 2, 3, 5 }; 
     int[] num3 = new int[] { 1, 2, 3 }; 
     int[] num4 = new int[] { 3, 2, 6 }; 

     numbers.add(num1); 
     numbers.add(num2); 
     numbers.add(num3); 
     numbers.add(num4); 

     Set<WrappedArray> wrappedNumberSet = new HashSet<>(); 

     int index = 1; 
     for (int[] number : numbers) { 
      if (!wrappedNumberSet.add(new WrappedArray(number))) { 
       System.out.println("Duplicate num" + index); 
      } 
      index++; 
     } 
    } 
} 
+0

Извините, что я новичок в Java, что такое hashCode()? и как вы его используете? – user2654764

+1

Hashcode возвращает значение, которое * обычно * отличается для любого объекта данных. 'HashSet' использует это, чтобы найти значения, затем выполняет' equals', чтобы узнать, идентичны ли они. –

+0

Что такое HashSet? – user2654764

1

Сортировать внутренний массив рода, такие как быстрая сортировка.

Вы можете сравнить массивы, выполнив Arrays.equals (num1, num3); , который работает только при сортировке массивов.

От Java док

«Два массива считаются равными, если оба массива содержат одинаковое число элементов, и все соответствующие пары элементов в двух массивах равны. Другими словами, два массива равны, если они содержат те же элементы в том же порядке "

+0

Вы уверены? Я думаю, вам нужно 'Arrays.equals()' для этого, Java '[I.equals()' наследует непосредственно от Object, другими словами, сравнивает ссылку. –

+0

Вы были верны. Отредактированное решение. –

Смежные вопросы