无论如何,我可以缩短这个 IF 语句吗?

Anyway I can shorten this IF statement?

我希望程序只打印符合 IF 语句设置的所有规则的 9 位数字。但是,我觉得它太长了,如果有人能给我一些可以缩短它的语法,我会很高兴。提前致谢:)

编辑:我需要仅使用数字 1,2 和 3 找出 3x3 网格的每一个不同组合。但是,1、2 和 3 只能在一行中一次,也只能在一个行中专栏一次。 N.b。我认为有 12 种不同的组合。

public static void main (String [] args){



    int count =0;

    for (int i=111111111; i<1000000000; i++){



        int X=i;
        String x= String.valueOf(X);
        String a1= x.substring(0,1);
        String a2= x.substring(1,2);
        String a3= x.substring(2,3);
        String b1= x.substring(3,4);
        String b2= x.substring(4,5);
        String b3= x.substring(5,6);
        String c1= x.substring(6, 7);
        String c2= x.substring(7,8);
        String c3= x.substring(8,9);

        int A1= Integer.parseInt(a1); 
        int A2= Integer.parseInt(a2);
        int A3= Integer.parseInt(a3);
        int B1= Integer.parseInt(b1);
        int B2= Integer.parseInt(b2);
        int B3= Integer.parseInt(b3);
        int C1= Integer.parseInt(c1); 
        int C2= Integer.parseInt(c2);
        int C3= Integer.parseInt(c3);

        if (A1+B1+C1+A2+B2+C2+A3+B3+C3==18 
            && A1<=3 && A2<=3 && A3<=3 && B1<=3 && B2<=3 && B3<=3 && C1<=3 && C2<=3 && C3<=3 
            && A1+B1+C1==6 && A1+A2+A3==6 
            && A1!=B1 && B1!=C1 && A1!=C1 && A1!=A2 && A2!=A3 && A1!=A3 && C1!=C2 && C2!=C3 
            && C1!=C3 && B1!= B2 && B1!=B3 && B2!=B3 && A3!=B3 && A2!=B2 && A3!=C3 && A2!=C2 
            && B2!=C2) 
        {             

                count++;                                                                                                        
                    System.out.println(count);
                    System.out.println(i);

我会编写两个单独的方法来帮助进行检查。一个检查三个字符确实是 '1', '2', 3',另一个接受 9 个字符的 String 并检查 String 的正确六个子集。然后,您只需在 if 语句中调用该方法一次即可。

public static boolean is123(char first, char second, char third) {
    List<Character> chars = Arrays.asList(first, second, third);
    return chars.contains('1') && chars.contains('2') && chars.contains('3');
}

public static boolean validSquare(String square) {
    for (row = 0; row < 3; row++) {
        if (!is123(square.charAt(row * 3), square.charAt(row * 3 + 1), square.charAt(row * 3 + 2))) {
            return false;
        }

    }
    for (column = 0; column < 3; column++) {
        if (!is123(square.charAt(column), square.charAt(column + 3), square.charAt(column + 6))) {
            return false;
        }
    }
    return true;
}

因此,如果您调用原始整数 i,那么您的 if 语句将只是 if (validSquare(String.valueOf(i)))。顺便说一句,最好使用信息量更大的变量名代替 i.

你应该把你的逻辑放到一个方法中。

public bool isXValid(int x)
{
    //insert logic here
}

那么你的 if 语句可以像这样

if(isXValid(x))
{
    //bla bla bla
}

更重要的是,你的方法应该更好地反映你正在尝试做的事情,从它的外观来看,你希望 x 满足以下规则:

  • x 是一个 9 位数字,
  • 它是3个3位数字的串联,
  • 每个 3 位数都有一个 1、一个 2 和一个 3
  • 没有两个 3 位数字在同一位置有相同的数字。

如果我要编写一个方法来检查它,我会:

  1. 将我的数字字符串拆分为 3 位数字。

  2. 我会验证每个 3 位数字都有一个 1、一个 2 和一个 3。如果有人没有,我会 return false,否则,我会继续函数。

  3. 我会确保没有 2 个 3 位数字在同一个地方有相同的数字。同样,如果 2 共享相同的数字,我会 return false,否则我会继续该函数。

  4. 最后,如果没有发现问题,我会return true

我同意其他人的看法,有很多方法可以简化您的代码,但是如果您只是想简化 if 语句,您可以这样做:

if (!(x.contains("6"))
     && A1*B1*C1==6 && A2*B2*C2==6 && A3*B3*C3==6
     && A1*A2*A3==6 && B1*B2*B3==6 && C1*C2*C3==6)

之所以可行,是因为只有 {1, 2, 3}{1, 1, 6} 三个正整数相乘,所以如果我们从一开始就排除 6,每一行和每一列都必须包含 1、2 和 3。