【问题标题】:For Loops and string comparisonsFor 循环和字符串比较
【发布时间】:2017-04-08 11:20:44
【问题描述】:

我正在重新处理 For 循环上的一个班级问题,并且无法从运行分数中获得总分。我尝试使用字符串比较,但这可能是问题所在。作业是:

“Simon Says”是一款记忆游戏,其中“Simon”输出 10 个字符(R、G、B、Y)的序列,用户必须重复该序列。创建一个比较从索引 0 开始的两个字符串的 for 循环。对于每个匹配项,将一个点添加到 userScore。在不匹配时,使用 break 语句退出循环。例如:以下模式产生的 userScore 为 4:

simonPattern: RRGBRYYBGY

用户模式:RRGBBRYBGY

import java.util.Scanner;

public class SimonSays {
   public static void main (String [] args) {
      String simonPattern = "";
      String userPattern = "";
      int userScore = 0;
      int i = 0;

      userScore = 0;
      simonPattern = "RRGBRYYBGY";
      userPattern  = "RRGBBRYBGY";

     /* Your solution begins here */

        String ss1 = simonPattern.substring(0, 2);
        String us1 = userPattern.substring(0, 2);

        String ss2 = simonPattern.substring(2, 3);
        String us2 = userPattern.substring(2, 3);

        String ss3 = simonPattern.substring(4, 5);
        String us3 = userPattern.substring(4, 5);

        String ss4 = simonPattern.substring(6, 7);
        String us4 = userPattern.substring(6, 7);

        String ss5 = simonPattern.substring(8, 9);
        String us5 = userPattern.substring(8, 9);

        for (i = 0; i < simonPattern.length(); i++) {
        if (ss1.equals(us1)) {
            userScore = userScore + 1;
        }
        if (ss2.equals(us2)){
            userScore = userScore + 1;
        }
        if (ss3.equals(us3)){
            userScore = userScore + 1;
        }
        if (ss4.equals(us4)){
            userScore = userScore + 1;
        }
        if (ss5.equals(us5)){
            userScore = userScore + 1;
        }
        else{
           break;
        }

    }

      /* ^ Your solution goes here ^ */

      System.out.println("userScore: " + userScore);

      return;
   }
}

【问题讨论】:

  • 不要使用== 来比较字符串。请改用equals() 方法。例如:if (ss1.equals(us1)) { ... }
  • 谢谢。我做了一些更改,现在总数是 40 而不是 4。我试图用 string.length() 停止循环,但我仍然感到困惑。
  • @L.Lab1 当您重复完全相同的代码 10 次时,您认为会发生什么? simonPattern 的长度为 10,因此您循环了 10 次,但循环内的代码不使用 i 做任何事情,所以如果 4 个是好的答案(包括 #5),那么您将得分加 4,10 次,对于总共 40 个。
  • 是的,我看到了,不知道怎么解决。我不确定如何设置 For Loop 语句以两个字符为一组进行交互。当我设置 i

标签: java loops


【解决方案1】:

您的问题在于您的 for 循环将 if (ss1 == us1) 更改为 if (ss1.equals(us1)) 与 else if 结构相同,因为 String 是引用类型而不是原始数据类型

原始数据类型为int,double,long,float,byte,short,boolean,char,所有对象均为引用类型

 public static void main (String [] args) 
 {
    String simonPattern = "";
    String userPattern = "";
    int userScore = 0;


    userScore = 0;
    simonPattern = "RRGBRYYBGY";
    userPattern  = "RRGBBRYBGY";

    String[] simons = new String[5];
    String[] users = new String[5];
    int adder=2;
    int location=0;
    for(int i=0;i<simonPattern.length();i+=2)
    {
        simons[location]=simonPattern.substring(i,adder);
        location++;
        adder+=2;
    }
    adder=2;
    location=0;
    for(int i=0;i<userPattern.length();i+=2)
    {
        users[location]=userPattern.substring(i,adder);
        location++;
        adder+=2;
    }



    for (int i = 0; i < simonPattern.length(); i++) 
    {
            if(users[i].equals(simons[i]))
                userScore++;



    }
    System.out.println(userScore);




    }

【讨论】:

  • 谢谢。我做了一些更改,现在总数是 40 而不是 4。我试图用 string.length() 停止循环,但我仍然感到困惑。
  • @L.Lab1 我为你创建了一些逻辑
  • @L.Lab1 或者要结束循环,您可以将 i=6 放到 else 语句中
  • 再次感谢您,这对我来说是 1 分...而不是 4 分
  • @L.Lab1 你为什么不试试字符串数组?我已经编辑了我的答案
【解决方案2】:

您可能需要考虑通过迭代 userPattern 来实现,而不是像这样:

int userScore = 0;

String simonPattern = "RRGBRYYBGY";
String userPattern  = "RRGBBYYBGY";
for (int i = 0; i < userPattern.length(); i++) {
    String p = userPattern.substring(0, 1 + i);
    if (simonPattern.startsWith(p)) {
        userScore = userScore + 1;
    }
}
if (userScore < simonPattern.length()) {
    System.out.println("You got " + userScore + " letters deep out of " + 
            simonPattern.length() + " before you made a mistake.");
}
else { 
    System.out.println("YOU WIN!"); 
}

【讨论】:

    【解决方案3】:

    您正确地将循环更改为 simonPattern 的迭代长度。现在您只需要丢弃循环内的代码并真正使用迭代器变量i

    要从字符串中提取单个字符,您可以继续使用substring(i, i+1) 来获取String 值,但对于单个字符,最好使用charAt(i)

    此外,要将变量加 1,最好使用 userScore++,而不是 userScore = userScore + 1,尽管这也可以。

    这意味着你的代码应该是:

    String simonPattern = "RRGBRYYBGY";
    String userPattern  = "RRGBBRYBGY";
    int userScore = 0;
    for (int i = 0; i < simonPattern.length(); i++) {
        char c1 = simonPattern.charAt(i);
        char c2 = userPattern.charAt(i);
        if (c1 != c2)
            break;
        userScore++;
    }
    System.out.println("userScore: " + userScore); // prints 4
    

    【讨论】:

    • 在第一次不匹配时打破循环!
    • @SanketMakani 是的,一开始我误解了目标。答案固定。
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多