Java 正在寻找执行此程序的最佳方法
我有两个.txt文件,第一个看起来像这样:Java 正在寻找执行此程序的最佳方法,java,Java,我有两个.txt文件,第一个看起来像这样: XXXXXXX XX0X0XX XX000XX XXXX0XX XXXXXXX .1.. .111 ...1 .... 第二个是这样的: XXXXXXX XX0X0XX XX000XX XXXX0XX XXXXXXX .1.. .111 ...1 .... 第一个文件需要被视为由零组成的孔,第二个文件需要被视为由一组成的图形。我需要编写一个算法来读取这两个文件,并检查第二个txt文件中的“数字”是否适合第一个txt文件中的“洞”。你认为最有效的
XXXXXXX
XX0X0XX
XX000XX
XXXX0XX
XXXXXXX
.1..
.111
...1
....
第二个是这样的:
XXXXXXX
XX0X0XX
XX000XX
XXXX0XX
XXXXXXX
.1..
.111
...1
....
第一个文件需要被视为由零组成的孔,第二个文件需要被视为由一组成的图形。我需要编写一个算法来读取这两个文件,并检查第二个txt文件中的“数字”是否适合第一个txt文件中的“洞”。你认为最有效的方法是什么
我认为最好的方法是将两个文件读入数组,然后在数组之间进行比较,但这只是我的第一个想法 另外,最终文件应如下所示:
XXXXXXX
XX1X0XX
XX111XX
XXXX1XX
XXXXXXX
一种方法可以是:
您可以逐行读取这两个文件。将两个文件的第n行传递给以下方法:
public static boolean isFit(String a, String b) {
return a.replace('X', '.').replace('0', '1').equals(b);
}
如果它返回
false
,那么它是一个错误匹配,否则最后你可以说它是一个匹配。这里是我提出的一个小方法,用于确定图形的特定线条是否与孔中的特定线条匹配
public static int figureLineFits(char[] figure, char[] hole){
// Since figure max length per line is 4 and hole is 5
// we have to try to match it on either one end or the other.
char[] hole1 = Arrays.copyOfRange(hole, 0, hole.length-1);
char[] hole2 = Arrays.copyOfRange(hole, 1, hole.length);
// We get rid of the extra holes in the hole array.
for (int i = 0; i < 4; i++){
if(figure[i] == '.'){
if(hole1[i] == '0') hole1[i] = 'X';
if(hole2[i] == '0') hole2[i] = 'X';
}
}
// Convert the arrays to Strings because I'm
// lazy to lookup equivalent array methods.
String compFigure = figure.toString();
String compHole1 = hole1.toString();
String compHole2 = hole2.toString();
// Replace the 0s with 1s and Xs with .s in the hole strings.
compHole1.replace('0', '1');
compHole1.replace('X', '.');
compHole2.replace('0', '1');
compHole2.replace('X', '.');
// Set up some comparison booleans.
boolean leftComparison = compFigure.equals(compHole1);
boolean rightComparison = compFigure.equals(compHole2);
// Do some boolean logic to determine how the figure matches the hole.
// Will return 3 if figure can be matched on both sides.
// Will return 1 if figure can be matched on left side.
// Will return 2 if figure can be matched on right side.
// Will return 0 if figure doesn't match on either side.
if(leftComparison && rightComparison) return 3;
if(leftComparison) return 1;
if(rightComparison) return 2;
return 0;
}
publicstaticintfigurelefits(char[]figure,char[]hole){
//因为图中每条线的最大长度为4,孔为5
//我们必须试着在一端或另一端匹配它。
char[]hole1=Arrays.copyOfRange(hole,0,hole.length-1);
char[]hole2=Arrays.copyOfRange(hole,1,hole.length);
//我们去掉了孔阵列中多余的孔。
对于(int i=0;i<4;i++){
如果(图[i]=='。){
if(hole1[i]='0')hole1[i]='X';
if(hole2[i]='0')hole2[i]='X';
}
}
//将数组转换为字符串,因为我
//懒于查找等效的数组方法。
字符串compFigure=figure.toString();
字符串compHole1=hole1.toString();
字符串compHole2=hole2.toString();
//将孔串中的0s替换为1s,将Xs替换为.s。
compHole1.替换('0','1');
compHole1.替换('X',');
compHole2.替换('0','1');
compHole2.替换('X',');
//设置一些比较布尔值。
布尔左比较=compFigure.equals(compHole1);
布尔rightComparison=compFigure.equals(compHole2);
//执行一些布尔逻辑以确定图形与孔的匹配方式。
//如果两边的数字都可以匹配,则返回3。
//如果左侧的图形可以匹配,则返回1。
//如果右侧的数字可以匹配,将返回2。
//如果两边的数字不匹配,将返回0。
if(leftComparison&&rightcarison)返回3;
if(leftComparison)返回1;
如果(右比较)返回2;
返回0;
}
然后你阅读图中的第一行,并尝试将其与孔的线条相匹配。
如果可以匹配它(图的定义
函数不返回0),则可以尝试将图的第二行与孔的下一行匹配
如果该比较未返回0,则必须检查匹配是否充分,例如,如果第一行返回1,下一行返回2,则该数字不匹配。如果第一行返回3,第二行返回1或2,那么匹配就足够了,因为“3”表示它在双方都匹配
如果您发现匹配不充分,则必须返回图形的第一行,并在匹配第一个图形线而非连续图形线后继续在该行上匹配,因为第一个图形线也可能匹配第二个孔线,尽管第二个图形线与孔线不匹配第二洞线
希望这能让你的头脑朝着正确的方向前进。到目前为止,你尝试过哪些解决方案?我认为最好的方法是将两个文件读入数组,然后在数组之间进行比较,但这只是我的第一个想法。更有效的方法是先尝试,然后来这里询问你是否遇到了问题。在询问任何事情之前,你需要向我们展示你在帮助自己方面所做的努力。首先,尝试找到一种方法,任何方法都可以,只要让它输出正确的结果。然后问你如何改进它。然后在Codereview上问它可能会更好。如果你仔细观察,你会发现图形(4x4)是一个比孔(5x5)更小的2D数组,当孔大于图形时,它也会错误地返回false。;)谢谢,所以基本上我需要将文件读入数组,然后将其转换为字符数组,然后再执行布尔逻辑?