【问题标题】:How does the .split() method work in java? [duplicate].split() 方法在 java 中是如何工作的? [复制]
【发布时间】:2013-06-29 07:02:53
【问题描述】:

我正在使用 Java,并且一直在尝试将我的字符串输入分成 3 个部分。例如,我的输入将是“AND 1 1”,我希望它进入条件为parts[0] ==“AND”的 if 循环。但事实并非如此,我不知道为什么。

下面列出了我的代码

Scanner stringInput = new Scanner(System.in);
String input = stringInput.next();
System.out.printf("%s\n", input);
String[] parts = input.split(" ");

if (parts[0] == "AND") {
    if (parts[1] == parts[2] && parts[1] == "1") 
        System.out.printf("1\n");
    else 
        System.out.printf("0\n");
}
else {
    if (parts[1] == "1" || parts[2] == "0")
        System.out.printf("1\n");
    else 
        System.out.printf("0\n");
}

【问题讨论】:

  • 确保将字符串与.equals()进行比较
  • NOOOOOOOOO...现在还是早上...为什么==?... :__(
  • 如果循环?也许这是一个条件语句

标签: java string split java.util.scanner


【解决方案1】:

在 Java 中,您无法确定字符串是否就是您认为的对象。因此,您不应该使用== 来比较对象,而应使用equals 函数。

if (parts[0] == "AND")

应该是

if (parts[0].equals("AND"))

字符串是不可变的,所以函数总是会返回新的字符串,当他们必须对它们做一些事情时。出于这个原因,使用== 只会在某些特定情况下有效,但在处理它们时永远不会。

【讨论】:

    【解决方案2】:

    您正在使用stringInput.next(),它不会读取空格。所以这就是问题所在。 使用stringInput.nextLine() 而不是stringInput.next()

    String input=stringInput.nextLine(); 在处理包含空格的文本时是正确的。

    这是修改后的代码。

    Scanner stringInput = new Scanner(System.in);
    String input = stringInput.nextLine();
    System.out.printf("%s\n", input);
    String[] parts = input.split(" ");
    
    if (parts[0] == "AND") {
        if (parts[1] == parts[2] && parts[1] == "1") 
            System.out.printf("1\n");
        else 
            System.out.printf("0\n");
    }
    else {
        if (parts[1] == "1" || parts[2] == "0")
            System.out.printf("1\n");
        else 
            System.out.printf("0\n");
    }
    

    您可能收到了ArrayIndexOutOfBoundsException

    【讨论】:

    • what is if (parts[0] == "AND") is not ALWAYS 因为它检查两者是否是同一类型的对象。
    • 它检查引用是否相等而不是值。当你用双引号写一些东西时,它被视为一个字符串对象。现在,“AND”是另一个字符串对象,parts[0] 是另一个字符串对象。现在检查参考。这就是为什么 equals() 是一个很好的方法。
    【解决方案3】:

    您正在以正确的方式使用String.split() 方法。使用该方法后,parts[0] 还包含所需的"AND"

    但问题是您正在使用 "==" 而不是 equals 方法检查两个字符串的相等性。当您使用 == 时,它会检查它们是否是相同的字符串引用,而 equals 方法检查字符串的值。

    所以你的检查应该是这样的

    if (parts[0].equals("AND"))
    

    【讨论】:

      【解决方案4】:

      使用

       parts[0].equals("AND") to check equality of `String`
      

      【讨论】:

        【解决方案5】:

        只是为了完成 Devolus 的答案(我还不能将 cmets 放入 cmets U_U)

        == 比较引用,这意味着只有当两个变量指向同一个对象时才为真

        例如

          Object a =  new Car()
          Object b =   a  
          Object c =  new Car()
        
        
        
        
        
          (a == b) //true
          (a == c)  //false
        
          a.equals(b)  //true  
          a.equals(c)  //true 
        

        【讨论】:

          【解决方案6】:

          试试这段代码:

          if (parts[0].toString().equals("AND")){
              if (parts[1].equals(parts[2]) && parts[1].equals("1")) 
                  System.out.printf("1\n");
              else 
                  System.out.printf("0\n");
          }else {
              if (parts[1].equals("1") || parts[2].equals("0"))
                  System.out.printf("1\n");
              else 
                  System.out.printf("0\n");
          }
          

          【讨论】:

          • 谢谢!顺便说一句,我已经检查了parts[0] 已经是 String 类型,那么为什么需要 .toString()?
          • 你可以删除那个东西
          • 由于parts是字符串数组,所以不需要使用toString
          【解决方案7】:

          有几个问题:

          • 正如 JavaTechnical 指出的那样,您应该使用 stringInput.nextLine()stringInput.next()
          • 正如大家所指出的,使用.equals()==,这是一个解释原因的线程:Java String.equals versus ==
          • 针对已知与未知进行测试,像 "AND".equals(part[0]) 那样重新排序您的测试应该保护您免受空指针的影响

          【讨论】:

            【解决方案8】:

            尝试使用.substring(),例如:

            String a = "AND 1 1"
            b = a.substring(1,3)
            c = a.substring(4,5)
            System.out.println(b)
            System.out.println(c)
            

            会打印“AND”然后是“1”

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-06
              • 2018-12-27
              • 2017-08-06
              相关资源
              最近更新 更多