2013-10-09 60 views
1

我爲我的作業寫了一段代碼,它表示輸入是否創建了一個幻方矩陣或者沒有。在幻方矩陣中,所有行,列和對角線總和必須相等。我寫了一些函數來計算行,列和對角線的總和。在代碼結束時,我需要比較它們,看看它們是否相等。我將函數的結果分配給了不同的變量,並且我將它們在代碼結尾的if語句中進行了比較。我想知道有沒有比較聰明的方法。我的意思是在我的if語句中有太多的變量和太多的平等。我相信這有一個更明智的方法。在if語句中比較太多變量

package lab03; 

import java.util.Scanner; 

public class E7_15 { 

public static boolean checkNumbers(int[][] array){ 
    for(int i=0; i<4; i++){ 
     for(int j=0; j<4; j++){ 
      if (array[i][j] < 1 || array[i][j] > 16){ 
       System.out.println("You entered a wrong value"); 
       return false; 
      } 
     } 
     } 
    return true; 
} 

public static int sumRow(int[][] array, int i){ 
    int sum = 0; 
    for(int j=0; j<array[i].length; j++){ 
     sum += array[i][j]; 
    } 
    return sum; 
} 

public static int sumColumn(int[][] array, int j){ 
    int sum = 0; 
    for(int i=0; i<array[j].length; i++){ 
     sum += array[i][j]; 
    } 
    return sum; 
} 

public static int diagonalSumRightToLeft(int[][] array){ 
    int sum = 0; 
    for(int i=0; i<array.length; i++){ 
     sum += array[i][array.length-1-i]; 
    } 
    return sum; 
} 

public static int diagonalSumLeftToRight(int[][] array) { 
    int sum = 0; 
    for(int i=0; i<array.length; i++){ 
     sum += array[i][i]; 
    } 
    return sum; 
} 

public static void main (String [] args){ 

    int[][] intArray = new int [4][4]; 
    Scanner in = new Scanner(System.in); 
    for (int i=0; i<4; i++) { 
     for (int j=0; j<4; j++) { 
      System.out.println("!!!Please enter your numbers between 1-16!!!"); 
      System.out.println("Enter your number for row " + (i+1) + " and column " + (j+1) + ": "); 
      intArray[i][j] = in.nextInt(); 
     } 
    } 
    boolean done = checkNumbers(intArray); 
    int sumLRD = diagonalSumLeftToRight(intArray); 
    int sumRLD = diagonalSumRightToLeft(intArray); 
    int r1 = sumRow(intArray, 0); 
    int r2 = sumRow(intArray, 1); 
    int r3 = sumRow(intArray, 2); 
    int r4 = sumRow(intArray, 3); 
    int c1 = sumColumn(intArray, 0); 
    int c2 = sumColumn(intArray, 1); 
    int c3 = sumColumn(intArray, 2); 
    int c4 = sumColumn(intArray, 3); 

    if (done == true){ 
     if(sumLRD==sumRLD && sumLRD==r1 && sumLRD==r2 && sumLRD==r3 && sumLRD==r4 && 
     sumLRD==c1 && sumLRD==c2 && sumLRD==c3 && sumLRD==c4 && sumRLD==r1 && sumRLD==r2 && 
     sumRLD==r3 && sumRLD==r4 && sumRLD==c1 && sumRLD==c2 && sumRLD==c3 && 
     sumRLD==c4 && r1==r2 && r1==r3 && r1==r4 && r1==c1 && r1==c2 && r1==c3 && r1==c4 && 
     r2==r3 && r2==r4 && r2==c1 && r2==c2 && r2==c3 && r2==c4 && r3==r4 && r3==c1 && 
     r3==c2 && r3==c3 && r3==c4 && r4==c1 && r4==c2 && r4==c3 && r4==c4 && c1==c2 && 
     c1==c3 && c1==c4 && c2==c3 && c2==c4 && c3==c4){ 
      System.out.println("This is a magic square matrix"); 
     } 
     else { 
      System.out.println("This is NOT a magic square matrix"); 
     } 
    } 
    if (done == false){ 
     System.out.println("WRONG VALUE! START AGAIN!"); 
    } 
    in.close(); 
} 

}

回答

3

好像你想看看所有這些數字都是平等的。只需使用一個循環,每一個變量與一個列表與它後面:

public boolean allEqual(int... values) { 
    for (int i = 0; i < values.length-1; i++) { 
     if (values[i] != values[i+1]) { 
      return false; 
     } 
    } 
    return true; 
} 

然後替換爲您megacondition:

if (allEqual(sumLRD, sumRLD, r1, r2, ...)) { 
    // ... 
} 

這工作,因爲平等是傳遞 - 也就是說,如果a == bb == c然後a == c。 (同爲任意數量的變量。)

另一種方法是對整個檢查重構爲類似:

boolean isMagicSquare(int[][] intArray) { 
    // check diagonals 
    int sum = diagonalSumLeftToRight(intArray); 
    if (sum != diagonalSumRightToLeft(intArray)) { 
     return false; 
    } 

    // check rows and columns 
    for (int i = 0; i < 4; i++) { 
     if (sum != sumRow(intArray, i) || sum != sumColumn(intArray, i)) { 
      return false; 
     } 
    } 

    return true; 
} 

// ... 
if (isMagicSquare(intArray)) { 
    // ... 
} 
+1

到OP:本'...'語法allEquals(被稱爲可變參數,或變量參數)可能是檢查人人平等的最簡潔的方式的數字,但你可能還沒有在你的研究中得到它。它會自動創建一個你傳遞的所有參數中的數組。 [本文來自java.net](https://today.java.net/pub/a/today/2004/04/19/varargs.html)可能會提供一些有用的上下文。 –

+0

我還添加了一個替代方法,它使用相同的方法,「展開」了一下,以幫助方法進行檢查。 – millimoose

0

你可以把你所有的款項在數組中,並使用一個函數像這樣的爲了檢查是否所有的值相等:

public static boolean allElementsTheSame(int[] array) { 
    if (array.length == 0) { 
     return true; 
    } else { 
     int first = array[0]; 
     for (int element : array) { 
      if (element != first) { 
       return false; 
      } 
     } 
     return true; 
    } 
}