【问题标题】:Java: Checking if a String is equal to a StringJava:检查字符串是否等于字符串
【发布时间】:2014-07-29 11:42:29
【问题描述】:

我有一个问题,我试图将一个对象的名称(字符串)与另一个字符串进行比较,我尝试使用 .equals()==,但在我的情况下似乎都不起作用。

我现在的代码是:

public boolean checkingObjectName(String checkName)
{
    for (int i=0; i<count; i++) //where 'count' has a value of 3
    {
        if (product[i].getName().equals(checkName)) //where product[i] has been initialised
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

程序总是返回 false,即使设置为product[i] 的名称与给定的参数相同。我已经尝试查看与 .equals()== 以及其他字符串引用相关的其他问题,但我没有找到与我的问题相关的任何东西。

我看到人们使用compareTo(),但我不确定我的代码中是否有必要这样做,我也不完全确定如何使用它。


编辑: 正如 Houssni 在 cmets 中所说,我刚刚意识到 return 语句结束了循环和方法。是否可以在第一次检查后不终止方法的情况下检查每个产品的名称,并让它返回一个布尔值?

编辑 2:我已将代码修改为所提供答案的说法,即:

public boolean checkingObjectName(String checkName)
{
    for (int i=0; i<count; i++) //where 'count' has a value of 3
    {
        if (product[i].getName().equals(checkName)) //where product[i] has been initialised
        {
            return true;
        }
    }
    return false;
}

product[i].getName() 不等于 checkName 并且该方法返回 false,即使它们应该相等,我仍然遇到同样的问题。关于为什么会发生这种情况的任何可能性,因为我查看了我的代码但我不确定。

编辑 3: 与上述代码块相关的唯一其他代码是来自另一个类的参数的输入,即:

String checkName = JOptionPane.showInputDialog("Enter the name: ");
while (storingProducts.checkingObjectName(checkName) == false) //assume for storingProducts
{
    JOptionPane.showMessageDialog(null, "No products were found. Please re-input name.");
    checkName = JOptionPane.showInputDialog("Enter the name: ");
    storingProducts.checkingObjectName(checkName);
}
if (storingProducts.checkingObjectName(checkName) == true)
//extra code

所以,这就是与我的问题相关的所有代码。我仍然不确定为什么该方法返回false,尽管这两个值都接收到相同的字符串值。

编辑 4: productcount 来自使用 checkingObjectName 方法的类:

public class Store
{
    private Product[] product; //Product is another class that just sets and gets
    private int count=3;

    public Store()
    {
        product = new Product[count];
        for (int i=0; i<count; i++)
        {
            product[i] = new Product();
        }
    //extra code

解决方案

我解决了这个问题:我没有使用.equals(),而是尝试使用.equalsIgnoreCase(),它成功了。

【问题讨论】:

  • 将所有代码发布到您测试它的位置并初始化产品数组
  • 如果只循环一次,为什么还要循环呢? return 语句终止循环和方法。
  • 如果 !product[0].getName().equals(checkName) 循环停止并且方法返回 false

标签: java string object methods equals


【解决方案1】:

比较字符串有两种方式:

  • 首先是通过字符串的地址进行比较。如:string blue = string red
  • 比较字符串的第二种方法是通过值。这可以通过使用string.equals("StringValue") 来完成。

【讨论】:

    【解决方案2】:

    如何将名称收集到List(或Set)并检查checkName 是否匹配?

    public boolean checkObjectName(final String checkName) {    
        List<String> productNames = new ArrayList<String>();
        for (Product prod : product) {
            productNames.add(prod.getName());
        }
        return productNames.contains(checkName);
    }
    

    请注意,这仅在您比较 区分大小写 字符串时才有效。或者,

    public boolean checkObjectName(final String checkName) {    
        List<String> productNames = new ArrayList<String>();
        for (Product prod : product) {
            productNames.add(prod.getName().toLowerCase());
        }
        return productNames.contains(checkName.toLowerCase());
    }
    

    如果您不喜欢这种方法,可以使用已经给出的方法,然后equals 替换为equalsIgnoreCase

    【讨论】:

      【解决方案3】:

      由于您有一个 return 语句,可以在每种可能的情况下达到(if 条件是 truefalse),该方法将在第一次迭代时始终退出.

      你能做什么?如果你想返回true如果名字存在于数组中,否则false,你可以这样做:

      public boolean checkingObjectName(String checkName)
      {
          for (int i=0; i<count; i++) //where 'count' has a value of 3
          {
              if (product[i].getName().equals(checkName))
                  return true;
          }
          return false; // if after all elements has been checked 
                        // and none was equal to 'checkName', return 'false'
      }
      

      【讨论】:

        【解决方案4】:

        该方法在遇到count 0 时立即返回,但找不到匹配项。如果您想遍历数组直到找到匹配的名称,您的代码应如下所示:

        public boolean checkingObjectName(String checkName)
        {
            for (int i=0; i<count; i++) //where 'count' has a value of 3
            {
                if (product[i].getName().equals(checkName)) //where product[i] has been initialised
                {
                    return true;
                }
            }
            return false;
        }
        

        【讨论】:

        • 我已将代码修改为您为我澄清的内容,但该方法仍然返回 false,即使参数是 - 例如 - Smoothie 和 @987654323 @ 也等于 Smoothie
        • i 是什么值?
        • i 的值为 0,但每次 product[i].getName() 不等于 checkName 时都会递增。最终,如果每个productcheckName的值不同,则退出循环,方法返回false。
        • 是的,我可以看到很多。但是您希望匹配哪个元素?您认为它包含这个特定字符串的依据是什么?
        • 好吧,在我的其余代码中,我希望将product[0].getName() 与参数匹配,并且我知道字符串是相同的,因为例如字符串“Smoothie”是被设置为product[0] 的名称,并且给定的参数也被设置为“Smoothie”。
        猜你喜欢
        • 1970-01-01
        • 2016-12-21
        • 1970-01-01
        • 2019-10-10
        • 2015-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        相关资源
        最近更新 更多