【问题标题】:Compare a string value with arraylist<object>将字符串值与 arraylist<object> 进行比较
【发布时间】:2020-10-19 16:00:23
【问题描述】:

我有一类人。

Public class Person{

private String name = "";

    public Person(String name) {
        
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

现在我有了另一个类,在类中我声明了一个数组列表

public class AddPerson {
public ArrayList<Person> pers = new ArrayList<Person>();

//here we add some persons to the arraylist
pers.add(new Person("Simon"));
pers.add(new Person("Oscar"));
pers.add(new Person("Alfred"));

String name = "Simon";
pers.contains(name); //return false
pers.equals(name); //return false 

//I also want to be able to return the value and index of the name in arraylist if it exsists.
if(pers.contains(name)) //return index and value
}

当我尝试检查两个字符串是否相等或者一个字符串是否已经在我的列表中时,我得到两个错误。我做了一些研究,发现我需要覆盖我的 equals 方法(以及mabey hash and contains 方法)。我不知道该怎么做,也找不到很好的参考。请帮助我实现这一目标。

【问题讨论】:

  • 您提出的建议可能不是一个好主意。为什么你希望一个集合等于一个字符串?你到底想达到什么目的?听起来您正在处理XY Problem

标签: java arraylist string-comparison


【解决方案1】:

这里的问题是你正在使用 contains 方法将 Person 对象与 String 对象进行比较。所以实际上在这种情况下实现 equals() 方法和 hashCode() 方法或使用 contains() 方法来解决是没有意义的这个。只有你需要做的是检查人的属性名称是否等于你的比较字符串名称。

示例解决方案:

String name="Simon";

Person result  = null;//To store the person object if a person name Simon found in the list
int personIndex = -1; //To store the index of founded person
int indexCount =-1;//To maintain the current index value of arrayList

for(Person tempPerson:pers){//Iterating the list to find a person name Simon
   indexCount++;
   if(pers.getName().equals(name)){
         personIndex = indexCount;
         result = tempPerson;
    }
}

现在您可以使用 personIndex 和 indexCount 变量中的值进行未来计算。您可以使用if(personIndex &gt;= 0) 之类的条件来检查迭代后是否真的找到了具有比较名称的人,然后您可以获得结果变量值.

【讨论】:

    【解决方案2】:

    那是因为你试图比较一个字符串 ("simon") 和一个从字符串构建的对象 Person (Person("Simon"))。这是两个不同的对象,因此出现false 是正常的。

    无论您是想比较两个Person(这是有道理的)还是您实际上是在尝试比较一个字符串和一个人,这肯定是一个坏主意(您实际上不能比较苹果和橙子,嗯这里也一样)。

    你可能想做的是是否

    1. 覆盖Personequals 方法,例如,如果它们具有相同的name,则返回true。 => 比较Persons
    2. 迭代您的pers 数组并通过getName() 获取它的名称属性以与您比较name 字符串=> 比较Strings

    1 =>

    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        final Person person = (Person)o;
        return name.equals(person.name);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
    

    2 =>

    for (final Person person : pers) {
        if(name.equals(person.getName())){
            // ...
        }
    }
    

    【讨论】:

    • 那么我应该如何将字符串与我的人员数组进行比较呢?
    • 如果您坚持尝试继续使用您的代码,那么您可以遍历您的人员列表并在找到匹配项时返回 true。 for (Person person : pers) { if (person.getName().equals(name)) { return true; } }
    • 我很抱歉,但它对我不起作用,我试图覆盖我的 equals 方法,它给了我错误。你能不能写出来让我看看它是怎么做的。谢谢
    • @Mohammed 我完成了回答您的评论的回答
    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2016-10-20
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多