2016-06-14 16 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

また、 'out'と' in'の両方の値が0に設定されているforループを入力すると、if条件にtrueを返し、真にimmediatlyを返しますので、基本的には1つの値をチェックします。 –

+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で述べたように、あなたのreturn文は、問題がある:

あなたは意味しないでください。

あなたはこのような何か必要があります:あなたがtrueを返す前にチェックを反転させて

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; 

を、あなたはすべての要素がチェックされていることを確認してください。

このように考えると、配列が対称ではないと言う条件を満たす要素が1つだけ見つかるだけです。しかし、配列が対称であると言う前に、すべての要素をチェックする必要があります。

あなたは逆のことをしていました.1つのチェックの後に配列が対称であると言っていました。

+0

はい、あなたは正しいです。私はそれを見ませんでした。しかしそれはまだ真実を与えている。 :/ –

+1

私は、このコードの他の問題について説明するために解決策を編集しました。 –

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

常にtrueを返します。

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

も常に真: はまた、「trueを返す」を呼び出すことである第一正の試合の後にループを終了します。

さらに効率を上げたい場合は、同じペアを2回チェックするのを避けるために、2番目のループを「アウト」に初期化したい場合は、数字をチェックしないでループを終了してくださいのように:

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; 
} 
関連する問題