【问题标题】:Testing characters of two Strings representing series of bits测试代表一系列位的两个字符串的字符
【发布时间】:2014-11-04 20:33:20
【问题描述】:

我正在尝试比较两个位链,如果任一位为“on”,则返回一个 V 表示 TRUE 和一个 F 表示 False,但它似乎不起作用。

如果我输入 1000 和 0000,它会产生 V F F F,这是正确的,但如果我输入 1000 和 0001,它会返回 V V V V,我似乎无法弄清楚为什么。

我哪里出错了?

    public static String ou (String s1, String s2) {    
        String chaineOU = "";
        char verifS1 = 0;
        char verifS2 = 0;           

        for (int i = 0; i < s1.length(); i++){
            verifS1 = s1.charAt(i);
            for (int n = 0; n < s2.length(); n++){
                verifS2 = s2.charAt(n);
            }

            if (verifS1 == '1' || verifS2 == '1'){
                chaineOU = chaineOU + 'V';
            } else {
                chaineOU = chaineOU + 'F';

            }
            return chaineOU; 
        }
    }

【问题讨论】:

  • 你为什么要循环获取verifS2?您目前仅使用s2中的最后一个字符...

标签: java string methods


【解决方案1】:

你的内部循环没有意义。它使您只检查 s2 的最后一个字符与 s1 的所有字符。

此外,您的退货声明似乎放错了地方。它应该在循环之后。

只需摆脱内部循环并移动 return 语句:

    for (int i = 0; i < s1.length(); i++){
        verifS1 = s1.charAt(i);
        verifS2 = s2.charAt(i);

        if (verifS1 == '1' || verifS2 == '1'){
            chaineOU = chaineOU + 'V';
        }else{
            chaineOu = chaineOU + 'F';
        }
    }
    return chaineOU; 

此代码假定s1 和s2 具有相同的长度。如果它们可能有不同的长度,您应该决定在这种情况下应该输出什么,并更改代码以反映这一点。

【讨论】:

  • 我应该怎么写才能逐个检查所有字符,而不是只使用最后一个?例如,我希望第一个字符与第一个字符、第二个到第二个等进行比较。
【解决方案2】:

看起来您想对“位”执行“或”(阅读代码,并考虑“chaineOU”在法语中的意思是“或链”),在这种情况下,您需要比较 位,所以你想要一个循环而不是两个。

你还有从in循环返回的问题。

试试这个:

public static String ou (String s1, String s2){

    String chaineOU = "";
    char verifS1 = 0;
    char verifS2 = 0;

    for (int i = 0; i < s1.length(); i++){
        verifS1 = s1.charAt(i);
        verifS2 = s2.charAt(i);

        if (verifS1 == '1' || verifS2 == '1'){
            chaineOU = chaineOU + 'V';
        }else{
            chaineOU = chaineOU + 'F';
        }
    }
    return chaineOU; 
}

你的测试用例是一个不幸的巧合。


顺便说一句,这段代码可以更简洁地重写为:

public static String ou (String s1, String s2){
    String chaineOU = "";
    for (int i = 0; i < s1.length(); i++)
        chaineOU += s1.charAt(i) + s2.charAt(i) > 96 ? 'V' : 'F`;
    return chaineOU; 
}

见live demo

这种简化源于以下观察:

  • 不需要对字符的引用;它只需要比较,所以删除char变量
  • 使用 if-else 将字符添加到结果中,使用三进制可以更优雅地表达
  • char是numeric类型,可以算术加,而字符'0'是十进制48,所以'0' + '0'是96。从逻辑上讲,如果任一字符为'1',则字符的总和将超过96,导致任一字符为'1' 的更简洁测试

【讨论】:

  • 不确定n 来自哪里,但我相信您的意思是i。
  • 谢谢!试图解决这个问题几个小时,你只用了 30 秒就解决了!
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多