【问题标题】:Looking for best way to do this program [closed]寻找执行此程序的最佳方法[关闭]
【发布时间】:2014-06-04 11:28:44
【问题描述】:

我有两个 .txt 文件,第一个看起来像这样:

XXXXXXX
XX0X0XX
XX000XX
XXXX0XX
XXXXXXX

第二个是这样的:

.1..
.111
...1
....

第一个文件需要被视为一个由零组成的孔,第二个文件需要被视为一个由一个组成的图形。我需要编写一个算法来读取这两个文件并检查第二个txt文件中的“图形”是否适合第一个文件中的“洞”。您认为最有效的方法是什么?

我认为最好的方法是将两个文件都读入数组,然后在数组之间进行比较,但这只是我的第一个想法。

最终文件也应该是这样的:

XXXXXXX
XX1X0XX
XX111XX
XXXX1XX
XXXXXXX

【问题讨论】:

  • 到目前为止您尝试了哪些解决方案?
  • 我认为最好的方法是将两个文件都读入数组,然后在数组之间进行比较,但这只是我的第一个想法。
  • 一个更有效的方法是先尝试,然后来这里询问您是否卡在某个地方。在就 SO 提出任何问题之前,您需要向我们展示您为帮助自己所做的努力。
  • 首先尝试找到一种方式,任何方式都可以,只要让它输出正确的结果即可。然后问你如何改进它。
  • 然后在 Codereview 上询问可能会更好。

标签: java


【解决方案1】:

一种方法可能是:

  1. 在一个数组中加载第一个文件
  2. 遍历第二个文件并将数组中的内容与文件中读取的内容进行比较。

【讨论】:

    【解决方案2】:

    您可以逐行读取这两个文件。将两个文件中的第 n 行传递给以下方法:

    public static boolean isFit(String a, String b) {
        return a.replace('X', '.').replace('0', '1').equals(b);
    }
    

    如果它返回false,那么它是不匹配的,否则最后你可以说它是匹配的。

    【讨论】:

    • 如果你仔细观察,你会发现这个数字 (4x4) 是一个比洞一 (5x5) 更小的二维数组。当洞比这个数字大时,它也会错误地返回 false。 ;)
    【解决方案3】:

    这是我总结的一个小方法,它可以确定图形的特定线是否与孔中的特定线匹配。

    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;
    }
    

    然后你阅读图的第一行并尝试将它与孔的线匹配。 如果可以匹配(figureLineFits 函数不返回 0),则可以尝试将图形的第二行与孔的下一行匹配。

    如果该比较不返回 0,那么您必须检查匹配是否足够,例如如果第一行返回 1,下一行返回 2,则数字不匹配。如果第一行返回 3,第二行返回 1 或 2,那么匹配就足够了,因为“3”意味着它在两边都匹配。

    如果您发现匹配不充分,则必须返回图形的第一行,并在匹配 第一个图形行而不是连续的图形行后的行上继续匹配它 因为第一个图形线也可能匹配第二个孔线,尽管第二个图形线与第二个孔线不匹配。

    希望这会让你的头脑朝着正确的方向前进。

    【讨论】:

    • 谢谢,所以基本上我需要将我的文件读取到数组,而不是将其转换为 char 数组,而不是使用布尔逻辑?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多