2016-03-05 4 views
1

Мой метод принимает два массива целых чисел и возвращает true еслиСравнивая элементы двух массивов

  1. Массивы имеют одинаковую длину и
  2. каждый a.element меньше b.element одного и того же индекса ,

Он работает для всех моих тестовых случаев, за исключением случаев, когда int[] a = {1, 2, 3} и int[] b = {4, 5, 1}. Он возвращает true, хотя a[2] > b[2]. Ошибка digitDifference работает неправильно, но я не вижу ошибки.

public static boolean allLess(int[] a, int[] b) { 
    int i = 0; 
    boolean sameLength = (a.length == b.length); 
    boolean digitDifference = (a[i] < b[i]); 
    for (i = 0; i <= a.length - 1; i++) {} 
    return (sameLength && digitDifference); 
} 

ответ

2

Ваш for петля ничего не делает, так что вы только для сравнения элементов в первом индексе массивов.

Ваш код должен выглядеть следующим образом:

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

Теперь цикл сравнивает каждую пару элементов, имеющих один и тот же индекс, и заканчивается, когда он находит пару, которая нарушает ваше требование, (a[i] < b[i]).

Другое эквивалентное реализации без флагов:

public static boolean allLess(int[] a, int[] b) { 
    if (a.length != b.length) 
     return false; 
    for (int i = 0; i <= a.length - 1; i++) { 
     if (a[i] >= b[i]) 
      return false; 
    } 
    return true; 
} 
2

digitDifference инициализируется перед циклом, и сравнить первые элементы обоих массивов, поскольку значение i «s равно 0 в этой точке. Вы никогда не сравниваете другие элементы массива. Сравнение должно быть сделано внутри петля.

BTW, ваше тело цикла даже не имеет одной инструкции.

3

Ваш метод сравнивает только первый элемент в каждом массиве - сравнение выполняется за пределами цикла for (который пуст!), А не внутри него. Переместите его туда, и все будет в порядке.

Стоит отметить, что использование идиомы раннего возвращения поможет значительно облегчить чтение кода в этом сценарии, так как вам не нужно продолжать «перетаскивать» текущее состояние с вами, просто не быстро, когда один из условия сломано:

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

Спасибо. Моя исходная схема использовала цикл «if», а затем цикл for, но я пытался использовать этот «boolean Zen», чтобы максимально уменьшить код. – aaronvan

2

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

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

Во-вторых, digitDifference в вашем коде оценивается только один раз, с первыми элементами в ваших массивах. Я считаю, вы хотели, чтобы for-loop выполнял сравнение несколько раз для каждого элемента массива, однако вы оставили тело цикла пустым.

Опять же, мое предложение состоит в том, чтобы вернуться, как только вы обнаружите, что один из элементов нарушает ваше ограничение. И просто получим return true; после цикла for, который укажет, что все элементы удовлетворяют ограничению a[i] >= b[i].