2013-10-09 33 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; 
    } 
}