2016-10-15 4 views
0

начинающий здесь!Метод для равных массивов

Я пытаюсь написать логический метод, который возвращает true, если два массива a и b имеют точно такие же элементы в одном порядке и false иначе.

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

int [] A = { }; 

int [] B = { }; 

Мой код до сих пор:

public static boolean equalArrays(int [] a, int [] b) { 
    if(a.length == 0 && b.length == 0) 
     return true; 
    else { 
     if(a.length == b.length) 
      for(int i = 0; i < a.length ; i++) 
       if (a[i] == b[i]) 
        return true; 
    } 
    return false; 
} 

EDIT1: Fixed код выше

EDIT2: Еще одна проблема, когда я стараюсь испытывать

int [] A = {2, 3, 4, 5, 6}; 
int [] B = {2, 3, 4, 6, 5}; 

Он возвращает true, когда предполагается, что он возвращает false. Кто-нибудь знает, где проблема?

+0

Вы компилируете 2 'пустых' массива, а не нулевые массивы! –

+0

Кажется, что OP использует «нулевой массив» неточно для обозначения массива длины 0. –

ответ

2

Проблема заключается в вашей петле. Оно должно быть:

public static boolean equalArrays(int [] a, int [] b) { 
    if(a == b){ 
     return true; 
    } 

    if(null == a || null == b){ 
     return false; 
    } 

    if(a.length != b.length){ 
     return false; 
    } 

    for(int i = 0; i < a.length ; i++){ 
     if (a[i]!=b[i]){ 
      return false; 
     } 
    } 

    return true; 
} 

Обратите внимание, что я сменил места true и false и теперь проверить != вместо == Это потому, что мы хотим, чтобы все элементы, чтобы быть равными, а не только некоторыми из них.

Как отметил косая черта, я добавил проверку на нуль

PS: Вы должны использовать скобки -> это делает код более читаемым

+0

@Tom Нет, это не так -> обратите внимание на 'if (a.length! = B.length) {' Но спасибо, за заметку :) –

+0

Он по-прежнему будет генерировать исключение, если один из массивов (или обоих) null – BackSlash

+0

Вот почему я прямо сказал, что он предполагает не нулевые массивы, как исходный код, но я могу добавить проверки для null, хотя это не было исходной проблемой в коде –

1

Обратите внимание, что

int [] A = { }; 

ли не пустой массив, что это пустой массив.

Хотя, у меня возникли проблемы с сравнивая два неопределенных массивы

Вы могли бы сделать что-то вроде этого:

if(a == null && b == null) { 
    // both arrays are null 
    return true; 
} 

if(a == null || b == null) { 
    // one of the two arrays is null, they are not equal 
    return false; 
} 

if(a.length == 0 && b.length == 0) { 
    // Both arrays are empty, they are equal 
    return true; 
} 
+0

Почему downvote? – BackSlash

+0

Я признаю, что мы пытаемся атаковать движущуюся цель здесь: вы не решили другую проблему, EDIT2, в вопросе. Это тоже очень важно. (Я не понизил) –

+0

@ OleV.V. Слайд-лист пришел, когда никаких изменений не было сделано :) Во всяком случае, комментарий в этом случае был бы гораздо более полезным, так как мы не получаем уведомления об обновлениях, поэтому мы не можем знать, было ли сообщение обновлено или нет. Было бы лучше оставить комментарий, в котором говорилось: «Ты не делал этого» вместо того, чтобы ниспровергать без причины. Доводка без причины - это как учитель, который дает вам F на экзамене и говорит: «Да, я хотел дать вам F, я не собираюсь объяснять вам почему». Совершенно бесполезно. – BackSlash

0
public static boolean equalArrays(int [] a, int [] b) { 
    if(a.length == 0 && b.length == 0) 
    return true 
    else { 
    if(a.length == b.length){ 
     for(int i = 0; i < a.length ; i++){ 
      if(a[i]!=b[i]) 
      return false; 
     } 
    } else return false; 

    } 
    return true; 
} 

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

+0

Этот код является неправильным. Вы только проверяете, находите ли вы хотя бы один элемент равным и возвращаете 'истину', а затем игнорируете другие элементы. И вы не проверяли, являются ли массивы «null», только если они пусты. 'null' и empty - разные вещи в Java. – Tom

+0

Это хорошо работает до сих пор, хотя при тестировании еще двух массивов – baked182

+0

Он работает хорошо, пока вы предоставляете равные массивы. Если вы используете разные массивы, которые имеют один и тот же первый элемент, он вернет true вместо false. [Demo] (http://ideone.com/IudXsZ) – BackSlash

1

Из Arrays.equals

public static boolean equals(int[] a, int[] a2) { 
    if (a==a2) 
     return true; 
    if (a==null || a2==null) 
     return false; 

    int length = a.length; 
    if (a2.length != length) 
     return false; 

    for (int i=0; i<length; i++) 
     if (a[i] != a2[i]) 
      return false; 

    return true; 
} 

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

+0

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

0

Вы можете попробовать что-то вроде этого ..

public static boolean comparearr(int a[] ,int b[]) 
    { 
    if(a.length!=b.length) 
    { 
     return false; 
    } 
     else 
     { 
     for(int i=0;i<a.length;i++) 
     { 
      if(a[i]!=b[i]) 
      return false; 
     } 
     } 
    return true; 
    } 

Примечание: также, когда вы говорите

int a[]={1,2,3}; 
and int b[]={}; 

в первом случае a массив инициализируется с 1,2,3 так свойством длины даст длина = 3, но в случае b его будет установлен как 0 как его не нулевой массив, его просто пустой массив с длиной = 0 из-за {} определение

+0

Нам не нужен 'if (a.length> 0)' перед циклом for. Если длины равны 0, цикл for будет просто исполнять 0 раз (то есть, пропускаться), и мы вернемся к 'return true' внизу, что даст правильный результат. Поэтому я бы предпочел упростить код и оставить вторую конструкцию if-else. –

+1

@ OleV.V. спасибо за указание ... отредактировал ответ ....: D – RohitS

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