验证子字符串是否相等

时间:2020-10-30 17:01:00

标签: java substring tdd

我正在尝试获取一个字符串,并将最后一位验证为字符串的其余部分。我做了两个子串。对于第一个子字符串,您必须将每个字符的位置乘以它的位置,然后将其添加到一个计数中,然后对整个计数的结果求模11。然后,这应等于第二个子字符串。我正在使用TDD,但收到一个错误,结果应为不相等。我不确定为什么,任何帮助都很好。

这是我的错误: Error

这是我的方法:

 public boolean checkEndingDigit(String s) {
    String endingCharacter = s.substring(s.length()-1);
    String startingCharacters = s.substring(0, s.length()-2);
    int startingCharSum = 0;
    boolean result = false;

    for (int i = 0; i < s.length()-2; i++) {

        if (Character.isDigit(startingCharacters.charAt(i))) {
            startingCharSum = Character.getNumericValue(startingCharacters.charAt(i) * i);
            System.out.println(startingCharSum);
        }
    }

    int endingCharSum = Character.getNumericValue(endingCharacter.charAt(0));
    int finalStartingCharSum = startingCharSum % 11;


    System.out.println(finalStartingCharSum);
    System.out.println(endingCharSum);

    if (finalStartingCharSum == endingCharSum) {
        result = true;
    }

    return result;
}

这是我的考试:

@Test
public void checkValidEndingDigit() {
    boolean result = validator.checkEndingDigit("0471958692");
    assertTrue(result);
}

任何帮助都会很棒!谢谢

3 个答案:

答案 0 :(得分:0)

仔细检查并测试可能的问题后,我相信问题在for循环声明中就很简单

由于您正在索引startingCharacters,并且startingCharacters的大小比s小2,因此在遍历它时也应考虑到这一点。我的更改应解决此问题

public boolean checkEndingDigit(String s) {
    String endingCharacter = s.substring(s.length()-1);
    String startingCharacters = s.substring(0, s.length()-2);
    int startingCharSum = 0;
    boolean result = false;

    for (int i = 0; i < s.length()-2; i++) {

        if (Character.isDigit(startingCharacters.charAt(i))) {
            startingCharSum = Character.getNumericValue(startingCharacters.charAt(i) * i);
        }
    }

    int finalStartingCharSum = startingCharSum % 11;
    int endingCharSum = Character.getNumericValue(endingCharacter.charAt(0));

    if (finalStartingCharSum == endingCharSum) {
        result = true;
    }

    return result;
}

答案 1 :(得分:0)

startingCharacters比s短,因此我走了很远。

for (... i < s.length() ...)
startingCharacters = s.substring(...);
startingCharacters.charAt(i)

答案 2 :(得分:0)

您做错了几件事。

首先进行以​​下操作:

String startingCharacters = s.substring(0, s.length()-2);

您应将-2更改为-1。这将忽略除我认为最后一个字符是您的校验位以外的所有字符。

您需要更改此

for (int i = 0; i < s.length(); i++) {

对此

for (int i = 0; i < startingCharacters.length(); i++) {

最后,您什么都不加。只是分配。并将i移动到getNumericValue方法之外。

startingCharSum = Character.getNumericValue(startingCharacters.charAt(i) * i);

但是,使用原始字符串,只需简单地迭代小于长度的一个并从1开始而不是0(乘以0总是得到0,那么为什么总是这样做),就可以使用原始字符串将上述内容替换为以下内容。

startingCharSum = 0;
for (int i = 1; i < s.length()-1; i++) {
     startingCharSum += Character.getNumericValue(s.charAt(i)) * i;
}

运行此命令时我也会出错。

请注意,当您乘以位置时,始终在第一个位置乘以0。如果正确,那么您总是可以从1开始循环,因为第一位的乘积始终为0。

相关问题