【问题标题】:arraylist: comparing an object with a stringarraylist:将对象与字符串进行比较
【发布时间】:2023-03-23 19:20:01
【问题描述】:

大家好,谁能告诉我哪里出错了?

这个类的基本目的是定义一个最喜欢的项目数组列表,在这种情况下是关于汽车的。汽车对象具有汽车名称和汽车 1-5 的评级。

您如何查看字符串是否等于汽车对象评级。 我弄乱了将字符串或 int 与数组列表中的汽车对象进行比较的部分。我的 equals() 方法有什么问题? contains() 方法可以以同样的方式工作吗?

numberOfItemsOfRating 方法允许用户指定评级,因此该方法返回没有带有评级的汽车。 searchForItems 方法检查指定的字符串描述是否与数组列表中的汽车名称匹配,因此返回数组列表中的汽车。

这里是我使用构造函数和变量的两个方法的一瞥:

public class FavouriteItems
{
    private ArrayList<Item> cars; 

    /**
     * Constructor for objects of class FavouriteItems
     */
    public FavouriteItems()
    {
        cars= new ArrayList<Item>();

    }

    /**
     * Add a new Item to your collection
     * @param newItem The Item object to be added to the collection.
     */
    public void addToFavourites(Item newItem) 
    {
        cars.add(newItem);

    }
    /**
     * Count the number of Items with a given rating 
     * @return The number of Items (Item objects) 
     *          whose rating is rating (could be 0).
     *          If the rating parameter is outside the valid
     *          range 1..5 then print an error message and return 0.
     */
    public int numberOfItemsOfRating(int rating)
    {
        int counter = 0;
        if(rating >= 1 && rating <=5) 
        {
            for ( int i =0; i < cars.size(); i++)
            {
                int num = rating;
                String al = Integer.toString(rating);
                if(cars.get(i).equals(al))
                {
                    counter++;
                }
            }
        }
        else 
        {
            System.out.println("No cars match your ratings");
            counter = 0;
        }
        return counter;
    }

    /**
     * Find the details of a Item given its description
     * @return Item object if its description is in the collection
     * or null if there is no item with that description
     */
    public Item searchForItem(String description) 
    {
         for(int i=0; i<cars.size(); i++)
        { 
            if(cars.equals(description))
            { 
                 return cars.get(i);
            } 
            else 
            { 
                return null;
            }
        }  
      }
} 

【问题讨论】:

  • 为 Car 实现 equals() 方法
  • 这是我尝试做的,但它似乎不起作用
  • 您正在将一个 Item 对象与一个 Integer 进行比较 - 这是您想要的吗?
  • 是的,这就是我们想要做的,equals() 对对象有效吗?
  • Item-class 中存储了什么?

标签: java string object arraylist


【解决方案1】:

您正在根据对象本身进行相等性检查,而您应该针对对象的属性进行检查。在您的特定情况下,您应该查看集合中每个 Car/Item 的 rating 属性。您的代码将如下所示:

final String ratingStr = Integer.toString(rating);

int counter = 0;
for (for final Item car: cars) {
    if(ratingStr.equals(car.getRating()) {
        ++counter;
}

System.out.println("Number of 'cars' with the rating is: " + counter);

两个快速的 cmets,您应该为您的 Item 类实现相等方法。但在这种情况下,这不是您问题的实际根源。此外,您在代码中提到了很多汽车,但您的 bean 类称为“项目”。您可能需要调和这一点,因为这可能会使阅读您的代码的其他人感到困惑。

别忘了修复你的searchForItem 方法,目前你正在测试数组列表与字符串的相等性,它永远不会返回true。以与上述相同的方式更正它,但使用汽车的description 属性,而不是rating 属性。

【讨论】:

  • 什么似乎不起作用?您是否在 Item 类上定义了获取/设置 ratingdescription 的方法?
【解决方案2】:

这不是你应该使用equals方法的方式,相反我建议你使用或实现Item#getRating()Item#getDescription()。使用cars.get(i).getDescription().equals(description) 检查描述。要检查评级,请使用cars.get(i).getRating() == rating

您不应该使用 equals 将 Item 与字符串进行比较,因为这会违反 equals contract

【讨论】:

  • 这并没有什么不同。我了解您如何调用 arraylist 中的每个特定项目,而不是添加 get(i) 是我的错误。谢谢
  • 您不应使用 Car 的 equals 方法来检查 Car 的评级或描述。而是使用 Car 的 getRating/getDesription 方法,然后使用 == 检查评级并使用 equals 检查描述。
  • 感谢我使用的评级 if(cars.get(i).getRating()== rating) 并且它有效,让我们看看 equals 方法是否适用于 searchitems:DX
  • 感谢这是我对描述方法所做的,它有效,您可能希望看到它:public Item searchForItem(String description) { int counter = 0;项目des = null; for(int i=0; i
  • 很高兴,我能帮上忙。好像还是有问题。你到底想返回什么?目前,您似乎返回了列表中与给定描述匹配的最后一个项目。如果要返回找到的第一个项目,可以将des = cars.get(i); 更改为return cars.get(i) 并将return des; 更改为return null
【解决方案3】:
if(cars.equals(description))

您的 ArrayList cars(在这种情况下是整个列表)永远不会等于单个字符串。

如果您想搜索汽车,您需要检查列表中的所有项目,并查看它们的名称(或您存储在 Item-class 中的任何信息)是否与给定的 description 匹配。

【讨论】:

  • 是的,这不是我想要做的吗?是的,我认为应该是 if(cars.get(i).equals(description)) 会起作用吗?
  • 这取决于您如何为Item 类实现equals 方法。如果你没有明确地实现它,这将不起作用。
【解决方案4】:
cars.get(i)

返回一个项目,而不是一个字符串。所以

if(cars.get(i).equals(al))

不正确。

【讨论】:

  • 对不起,用 iPad 回答并不简单,尤其是当我不是英语的时候:)
【解决方案5】:

if(cars.get(i).equals(al)) 在这里你将字符串与对象进行比较,所以它是错误的 万一使用,你可以试试下面的编码

if(cars.get(i).getItem().equals(al))

可能 getItem() 是汽车类中名为“item”的变量之一,键入为“字符串”并将其放入 getter 和 setter。

lly if(cars.equals(description)) 是错误的。在这里,您正在尝试将列表名称与字符串进行比较 所以最好使用下面的编码

 if(cars.get(i).getDescription().equals(description))
    return cars.get(i);

可能 getDescription() 是汽车类中名为“description”的变量之一,键入“string”并将其放入 getter 和 setter。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2016-07-22
    • 2016-10-20
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    相关资源
    最近更新 更多