2016-06-14 3 views
2

Я пытаюсь проверить, что мой 2D-массив симметричен или нет. Я написал метод проверки, является ли массив симметричным. Он всегда возвращает true, даже если я меняю элементы во входном массиве. Что я делаю не так?Почему мой метод не возвращает false при изменении элемента массива?

Вот мой код:

public class learnigBoolean 
{ 
    public static void main(String[] args) 
    { 
     int[][] array = { 
      { 1, 1, 4, -1}, 
      { 1, 5, 0, -1}, 
      { 4, 0, 1, -4}, 
      {-1, -1, 4, 10} 
     }; 

     System.out.println(symetrisk(array)); 
    } 

    public static boolean symetrisk(int[][] f) 
    { 
     for (int out = 0; out < f.length; out++) { 
      for (int in = 0; in < f[out].length; in++) { 
       if (f.length == f[out].length && f[out][in] == f[out][in]) { 
        return true; 
       } 
      } 
     } 
     return false; 
    } 
} 
+3

Есть ли какой-либо пункт для 'f [out] [in] == f [out] [in]'? Любое заданное значение всегда будет равным самому себе. –

+0

также при вводе циклов for, когда значения 'out' и' in' установлены на 0, вы получаете значение true для условия if и немедленно возвращаете true, поэтому вы просто просто проверяете одно значение –

+0

@MarcB Нет, 'NaN' не будет ... – glglgl

ответ

5
if(f.length==f[out].length && f[out][in]==f[out][in]) 

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

Вы имеете в виду:

if(f.length==f[out].length && f[out][in]==f[in][out]) 

Но ваше возвращение заявление проблематично, как заявил Майкл Faisst.

Вам нужно что-то вроде этого:

for (int out = 0; out < f.length; out++) { 
     for (int in = 0; in < f[out].length; in++) { 
      if (f.length != f[out].length || f[out][in] != f[in][out])) { 
       return false; 
      } 
     } 
    } 
    return true; 

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

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

Вы делали обратное, говоря, что массив является симметричным после одной проверки.

+0

да, вы правы. Я этого не видел. Но это все еще верно. :/ –

+1

Я отредактировал решение, чтобы объяснить другую проблему с кодом. –

2
f[out][in] == f[out][in] 

Всегда будет возвращать true. Также вызов «возвращает истину» будет выйти из цикла после первого положительного матча, который:

f[0][0] == f[0][0] 

также всегда верно.

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

public static boolean symetrisk(int[][] f) 
{ 
    for (int out = 0; out < f.length; out++) { 
     if (f.length == f[out].length) //only need to check this once per row. 
     { 
      for (int in = out + 1; in < f[out].length; in++) 
      { 
       if (f[out][in] != f[in][out]) 
       { 
         return false; //once we find a non-matching value we stop checking 
       } 
      } 
     } 
     else 
     { 
      return false; //non-square array. 
     }   
    } 
    return true; 
} 
Смежные вопросы