无论如何,我可以缩短这个IF声明吗?

时间:2015-01-07 21:36:42

标签: java if-statement

我希望程序只打印符合IF语句设置的所有规则的9位数字。但是,我觉得它不必要地长,如果有人能告诉我一些缩短它的语法,我会很喜欢它。在此先感谢:)

编辑:我需要仅使用数字1,2和1来计算3x3网格的每个不同组合。但是,1,2和2。 3只能单行ONCE,也可以单行ONCE。 注:我认为有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);

3 个答案:

答案 0 :(得分:2)

我同意其他人的说法,有很多方法可以简化您的代码,但如果只是想要简化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)

这样做的原因是,只有3个正整数的袋子是{1, 2, 3}{1, 1, 6},所以如果我们从一开始就排除6个,那么每个行和每列必须包含1个,2和3。

答案 1 :(得分:1)

我会写两个单独的方法来帮助检查。一个用于检查三个字符确实是'1', '2', 3',另一个用于接受String个9个字符并检查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;
}

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

答案 2 :(得分:0)

你应该将你的逻辑放入一个方法中。

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

然后你的if语句看起来像这样

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

更重要的是,您的方法应该更好地反映您尝试做的事情,并且从外观上看,您希望x符合以下规则:

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

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

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

  2. 我会验证每个3位数字都有1,a 2和a 3.如果有人没有,我会return false,否则,我只是继续使用该功能。

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

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