无论如何,我可以缩短这个 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 位数字在同一位置有相同的数字。
如果我要编写一个方法来检查它,我会:
将我的数字字符串拆分为 3 位数字。
我会验证每个 3 位数字都有一个 1、一个 2 和一个 3。如果有人没有,我会 return false
,否则,我会继续函数。
我会确保没有 2 个 3 位数字在同一个地方有相同的数字。同样,如果 2 共享相同的数字,我会 return false
,否则我会继续该函数。
最后,如果没有发现问题,我会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。
我希望程序只打印符合 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 位数字在同一位置有相同的数字。
如果我要编写一个方法来检查它,我会:
将我的数字字符串拆分为 3 位数字。
我会验证每个 3 位数字都有一个 1、一个 2 和一个 3。如果有人没有,我会
return false
,否则,我会继续函数。我会确保没有 2 个 3 位数字在同一个地方有相同的数字。同样,如果 2 共享相同的数字,我会
return false
,否则我会继续该函数。最后,如果没有发现问题,我会
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。