2016-03-22 4 views
-3

Я пытаюсь проверить, имеют ли две массивы одинаковой длины и одинаковые значения в одном и том же месте.Сравнение значений двух массивов с использованием рекурсии?

Мой текущий код выглядит следующим образом:

 public class MyArray { 
private int size; 
private int[] array; 
private boolean isSorted; //to check if array is sorted 
private static int arrCount; //used to identify which MyArray object 

public MyArray(){ 
    size = 10; 
    array = new int[10]; 
    arrCount+=1; 

} 
public MyArray(int Size){ 
    size = Size; 
    array = new int[Size]; 
    arrCount+=1; 

} 
public MyArray(MyArray arrOther){ 
    this.size = arrOther.getSize(); 
    this.array = arrOther.getArray(); 

    arrCount+=1; 
} 
public int getSize(){ 
    return size; 
} 
public int[] getArray(){ 
    return array; 
} 
@Override 
public boolean equals(Object other){ 
    if (other instanceof MyArray){ 
     MyArray second = (MyArray) other; 
     if (second.getSize() == this.getSize()) 
     return equalsHelper(this.getArray(), second.getArray(), 0, (size-1)); 
    } 
    //else 
    return false; 
} 
private boolean equalsHelper(int[] first, int[] second, int iStart, int iEnd) { 
if (iStart == iEnd) { 
    return true; 
} 

if (first[iStart] == second[iStart]) { 
    if (equalsHelper(first, second, (iStart + 1), iEnd)) { 
     return true; 
    } 
} 
return false; 
} 
}//end class 

по какой-то причине он всегда возвращает значение ИСТИНА, даже если массивы в другом порядке.

метод равно вызывается в основной программе здесь:

--main method-- 
if (MA2.equals(MA1)) //the arrays are identical here 
{ 
    System.out.println("The first and second arrays are equal."); 
} 
else {System.out.println("The first and second arrays are NOT equal.");} 

MA2.sort(); //the order of the elements changes 
System.out.println("The second array has been sorted in ascending order."); 

    if (MA2.equals(MA1)) 
{ 
    System.out.println("The first and second arrays are equal."); 
} 
else {System.out.println("The first and second arrays are NOT equal.");} 
+2

Клянусь, что другая женщина в своем классе разместила то же самое. – pczeus

+2

@pczeus - это действительно актуальный секс? – Blorgbeard

+0

Невозможно воспроизвести «всегда возвращает true»: см. [IDEONE] (https://ideone.com/XHcxdX).Сравнение двух массивов «1, 2, 3» возвращает true, как и ожидалось, и сравнение «1, 1, 1' с« 1, 2, 3' возвращает ** false **. – Andreas

ответ

0

Первая проверка (желательно) за пределами вашего помощника должна быть, чтобы увидеть, если оба массива имеют одинаковую длину. Не имеет смысла продолжать в противном случае.

equalsHelper должен возвращать true, если конец массива достигнут.

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

Призвание:

.... 
.... 
if(first.length != second.length) 
    return false; 
return equalsHelper(first, second, 0); 

Вспомогательный метод ...

private boolean equalsHelper(int[] first, int[] second, int indx) { 
    if(indx == first.length) 
     return true; 
    if(first[indx] != second[indx) 
     return false; 
    return equalsHelper(first, second, indx+1); 
} 
+0

Хорошая оптимизация, но не ответ, так как рассматриваемая версия работает нормально. – Andreas

+1

@ Код Andreas не работает для массивов разной длины, в то время как OP указывает «Я пытаюсь проверить, имеют ли две массивы одинаковые длины и одинаковые значения в одной и той же точной позиции». Я просто пытался заставить его идти по правильному пути. Если вы все еще думаете, что я написал неправильно, я избавлюсь от ответа. :) –

+0

Вы правы в этот момент, но это не отвечает на вопрос, почему OP всегда получает 'true', на который нет реального ответа, потому что я получил его, чтобы вернуть' false'. – Andreas

-2

Во-первых, Istart и iEnd являются избыточными. использовать .Length

String[] array = new String[10]; 
int size = array.length; 

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

for(int i = 0: (i > first.length || i > second.length; i++){ 
     if(first[i] != second[i]){ 
      return false; 
     } 
    } 
    return true 

Ваша следующая задача

if (iStart == iEnd){ 
      return first[iEnd] == second[iEnd]; //return true or false 

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

Длина массива задается вручную, поэтому это осознанное усилие разница.

Позвольте мне предложить ArrayList, если вы ожидаете различной длины. Они также более гибкие.

ArrayList <Integer> a = new ArrayList <int>(); 

ArrayList <Integer> b = new ArrayList <int>(); 

Тогда вам нужно будет проверить их длину. ArrayList использует метод .length() вместо массива []. Длина собственность

if(a.length() == b.length()){ 

затем, если вы хотите увидеть, если каждое значение в каждом индексе одинаково, вам необходимо пройти через массив вручную показано выше.

+0

'areArraysIdentical' не рекурсивный, и это, очевидно, является требованием. --- 'first [iEnd] == second [iEnd]' does * not * сравнить адрес памяти, он сравнивает два значения 'int'. --- 'ArrayList ' - ошибка компиляции. Вы не можете использовать примитивы с дженериками. – Andreas

+0

Просто введите два массива, как inputi, для ясности. Да, решил. – mewc

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