有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我的函数有逻辑错误吗?

我试图做一个函数,比较两个不同的4位数字

如果这些数字在同一个地方有一些数字,它将是+,相同的数字但在不同的地方-

例如,如果一个数字是5606,另一个是6668,那么它应该产生+-。然而,产生的是+--

我将数字改为x和y以防止一个数字被重复使用,但它仍然不起作用。我的密码有错误吗

public String comparenumbers(String number) {
    result ="";
    for (int i = 0; i < 4; i++) {
        if (number.charAt(i) == fakecomputernumber.charAt(i)){
            result += "+";
            char[] myNameChars = fakecomputernumber.toCharArray();
            myNameChars[i] = 'x';
            fakecomputernumber = String.valueOf(myNameChars);
            char[] myNameChars2 = number.toCharArray();
            myNameChars2[i] = 'y';
            number = String.valueOf(myNameChars2);
        }
    }
    for (int i = 0; i < 4; i++) {
        if (number.charAt(i) != fakecomputernumber.charAt(i) && 
          fakecomputernumber.indexOf(number.charAt(i))!=-1){
            result += "-";
            char[] myNameChars = fakecomputernumber.toCharArray();
            myNameChars[i] = 'x';
            fakecomputernumber = String.valueOf(myNameChars);
            char[] myNameChars2 = number.toCharArray();
            myNameChars2[i] = 'y';
            number = String.valueOf(myNameChars2);
        }
    }
    if (result =="") {
        result += "miss";
    } else if (result =="++++") {
        result = "Congratz you won!!!";
    }
    return result;
}

共 (3) 个答案

  1. # 1 楼答案

    问题在第二个循环中,如果

     if(number.charAt(i)!=fakecomputernumber.charAt(i)&&fakecomputernumber.indexOf(number.charAt(i))!=-1)`
    

    即第二个条件fakecomputernumber.indexOf(number.charAt(i))!=-1检查number的第i个字符是否存在于除第i个字符外的任何fakecomputernumber索引中,因为您已经在第一个条件中检查了它 最初如果

    String fakecomputernumber="5606";
    String number="6668";
    //after first loop
    result="+" //expected
    number="6y68"  //expexted
    fakecomputernumber="5x06" //expected
    
    //in the second loop if for the zero index
    
     myNameChars[i] = 'x';  //wrong because i is not the index of fakecomputernumber character which is same to i index character of number 
     fakecomputernumber = String.valueOf(myNameChars);
    

    因此,对于第二个循环的第一次迭代,您知道必须将number的第一个元素更改为y,但您不知道将fakecomputernumber的元素更改为x。因此,要解决这个问题,只需改变路线

    myNameChars[i] = 'x';
    

    myNameChars[fakecomputernumber.indexOf(number.charAt(i))] = 'x';
    

    完整代码

    String fakecomputernumber="5606";String number="6668";
     String result ="";
    for(int i=0;i<4;i++){
        if(number.charAt(i)==fakecomputernumber.charAt(i)){
            result += "+";
            char[] myNameChars = fakecomputernumber.toCharArray();
            myNameChars[i] = 'x';
            fakecomputernumber = String.valueOf(myNameChars);
            char[] myNameChars2 = number.toCharArray();
            myNameChars2[i] = 'y';
            number = String.valueOf(myNameChars2);
        }
    }
    System.out.println(result+number+fakecomputernumber);
    for(int i=0;i<4;i++){
        if(number.charAt(i)!=fakecomputernumber.charAt(i)&&((fakecomputernumber.indexOf(number.charAt(i))!=-1))){
            result += "-"; System.out.println("inside "+i);
            char[] myNameChars = fakecomputernumber.toCharArray();
            myNameChars[fakecomputernumber.indexOf(number.charAt(i))] = 'x';//change this line only
            fakecomputernumber = String.valueOf(myNameChars);
            char[] myNameChars2 = number.toCharArray();
            myNameChars2[i] = 'y';
            number = String.valueOf(myNameChars2);
            System.out.println(result+number+fakecomputernumber);
        }
    }
    if(result ==""){
        result += "miss";
    }else if(result =="++++"){
        result = "Congratz you won!!!";
    }
    System.out.println(result);
    }
    

    Demo

  2. # 2 楼答案

    代码正在按以下方式运行:

    位置2的“+”符号,两个字符都是6

    “-”标志由于:

    if(number.charAt(i)!=fakecomputernumber.charAt(i)&&fakecomputernumber.indexOf(number.charAt(i))!=-1)
    

    5 6 true && true > "-" added to string

    6 6 false && false

    0 6 true && false

    6 8 true && true(6 do exist in 2nd string) > "-" added to string

    我不确定问题陈述是否正确,因此在您共享相同的代码之前,无法修复您的代码

    代码中的逻辑错误:

    字符串是不可变的对象

    如果我们有两个字符串foo和bar:

    foo==bar将比较这两个对象的内存引用

    福。等于(bar)将比较存储在内存引用中的值

    所以,若要检查结果字符串中的内容,应该使用。等于(…)方法,并且还有您的逻辑错误

  3. # 3 楼答案

    您的错误在第二个循环中:

    当您发现number.charAt(i)出现在fakecomputernumber的某个地方时,您可以将number的第i个字符更改为“y”,这很好。但是您还将fakecomputernumber的第i个字符更改为“x”,这是错误的,因为fakecomputernumber的第i个字符不等于number的第i个字符

    如果FakeComputer编号为5606,编号为6668:

    在第一个循环之后,您有一个+并且字符串变成:6y68和5x06

    sencond循环两次发现fakecomputernumber中包含6:

    第一次将字符串更改为yy68和xx06
    第二次将字符串更改为yyy8和xxx6

    因此,您得到的是+ ,而不是+-

    你应该做的是:

        for(int i=0;i<4;i++){
            if(number.charAt(i)!=fakecomputernumber.charAt(i)&&fakecomputernumber.indexOf(number.charAt(i))!=-1){
                result += "-";
                char[] myNameChars = fakecomputernumber.toCharArray();    
                myNameChars[fakecomputernumber.indexOf(number.charAt(i))] = 'x';            
                fakecomputernumber = String.valueOf(myNameChars);
                char[] myNameChars2 = number.toCharArray();
                myNameChars2[i] = 'y';
                number = String.valueOf(myNameChars2);
            }
        }