【问题标题】:Java for each - Searching through ArrayListJava for each - 搜索 ArrayList
【发布时间】:2014-04-10 21:36:12
【问题描述】:

我正在尝试搜索数组列表并返回一个对象。我有一个 Vehicle 类,其中有一个名为 search 的方法,注册号和数组列表作为参数作为参数传递。

但是问题在于,在执行 for each 时,系统从不尝试比较 2 个字符串(注册号),因此该方法总是返回一个空对象。

方法:

 public Vehicle search(String id, List<Vehicle> myList) {
    Vehicle currenctVeh = new Vehicle();
     for(Vehicle v: myList)
     {
         if(v.regNo == id)
         {
             currenctVeh = v;
         }
     }
     return currenctVeh;
}

被调用:

Vehicle searchVeh = new Vehicle();
            String regNum = JOptionPane.showInputDialog(null, "Enter Vehicle Registration Number");
            searchVeh.search(regNum, allVehicles);
            System.out.println(searchVeh.toString());

【问题讨论】:

标签: java arraylist foreach


【解决方案1】:

字符串比较使用equals,而不是==

== 在处理原始类型时可以工作,但对于对象则有区别:

  • == 检查变量是否引用相同的对象。
  • equals 检查变量引用的对象是否相同(取决于这些对象的 equals 的具体实现)。

你需要这个:

if(v.regNo.equals(id))
{
    currenctVeh = v;
}

另外,您不需要将 currenctVeh 初始化为新车,这就足够了:

Vehicle currenctVeh = null;

【讨论】:

    【解决方案2】:

    使用v.regNo.equals(id),否则比较是在具有相同地址的对象之间进行,而不是在应该发生的具有相同值的对象之间进行。

    【讨论】:

    • 要回答这个问题,我需要查看代码 vor Vehicle
    【解决方案3】:

    如果您可以保证其中一个不会为空,请使用 field1.equalsIgnoreCase(field2) 之类的内容

    或者使用你可以使用的库StringUtils.equalsIgnoreCase(field1,field2)

    【讨论】:

      【解决方案4】:
       public Vehicle search(String id, List<Vehicle> myList) {
           for(Vehicle v: myList)
           {
               if(v.regNo.equals(id))
               {
                   return v;
               }
           }
           // You should decide what to return in case of vehicle no found
           return null;
           // return new Vehicle();
      }
      

      【讨论】:

      • 好吧,我认为这很好,但是为什么我在使用 toString 方法显示时会得到这辆 Vehicle{price=0.0, regNo=null}
      • 期望的输出是什么? @user3430861
      • 我猜你得到这个输出是因为你没有在搜索中找到车辆。您确定您搜索了正确的车辆 ID 吗? PS:equals方法是区分大小写的,所以ABC和abc是不一样的。如果您希望它不区分大小写,请使用 equalsIgnoreCase(...) @user3430861
      【解决方案5】:

      使用equals() 而不是==

      至于String类等于检查它的内容和==检查参考

      【讨论】:

        【解决方案6】:

        通过在 Java 中使用 == 比较两个字符串,您可以检查您要比较的 2 个变量是否引用同一个对象,如果它们具有相同的字符串值,则 不是

        如果要检查字符串内容是否相等,必须使用方法equals

        if(v.regNo.equals(id)){.....}
        

        例如:

        String s1 = new String("Test");
        String s2 = new String("Test");
        

        s1 == s2 将给出false 结果作为表达式, 而s1.equals(s2) 将提供true

        注意:字符串常量在 Java 中保存在一个常量“池”中, 一个保持唯一常量的结构。因此,"Test" == "Test" 表达式将给出true, 正如我们必须在“池”中使用相同的常量。

        【讨论】:

          猜你喜欢
          • 2011-05-07
          • 2015-01-29
          • 2010-11-02
          • 1970-01-01
          • 2011-07-21
          • 1970-01-01
          • 2012-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多