如何检查存储在hashmap中的对象中是否存在字符串?

时间:2015-03-03 10:54:26

标签: java collections hashmap

我创建了一个包含3个参数的Employee类。

  1. 编号
  2. 名称
  3. 年龄
  4. 要求:根据名称进行搜索。这是所有员工都有唯一名称的情况。它必须使用key作为id添加对象。在极少数情况下,需要根据名称进行搜索。

    我做了什么:

    在课程中,我重写了hashCode和Equals方法。

    我将这些对象的列表添加到hashmap中,其id为key,值为Employee对象

    但是在添加或搜索散列图时,这两种方法都不会被调用

    那么这些方法在hasmap方面的用途是什么?

    员工类

    public class Employee {
    
        private int id;
        private String name;
        private int age;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public int hashCode() {
            return name.hashCode();
        }
    
        public boolean equals(Employee emp) {
            if (emp == null)
                return false;
            else if (emp.name.equalsIgnoreCase(this.name))
                return true;
            else
                return false;
        }
    }
    

    主要方法:

    public class HashMapTest {
    
        public static void main(String[] args) {
    
            Employee emp1=new Employee();
            emp1.setId(1);
            emp1.setName("Maclean");
            emp1.setAge(24);
    
            Employee emp2=new Employee();
            emp2.setId(2);
            emp2.setName("Sampath");
            emp2.setAge(25);
    
            Employee emp3=new Employee();
            emp3.setId(3);
            emp3.setName("Achar");
            emp3.setAge(27);
    
            Employee emp4=new Employee();
            emp4.setId(4);
            emp4.setName("Sudheer");
            emp4.setAge(25);
    
            Employee emp5=new Employee();
            emp5.setId(5);
            emp5.setName("Kunder");
            emp5.setAge(25);
    
            HashMap<Integer, Employee> empmap=new HashMap();
            empmap.put(emp1.getId(), emp1);
            empmap.put(emp2.getId(), emp2);
            empmap.put(emp3.getId(), emp3);
            empmap.put(emp4.getId(), emp4);
            empmap.put(emp5.getId(), emp5);
    
            Employee emp=new Employee();
            emp.setName("Maclean");
            System.out.println(empmap.containsValue(emp));
    
            System.exit(1);
        }
    
    }
    

    更新解决方案:

    感谢所有答案。

    1。只有当Key是一个对象并且该方法存在于Key Class

    中时,才会调用hashCode方法

    2。 Equals(Employee emp)导致函数重载而不是覆盖。我应该使用equals(Object o)

    解决问题的代码更改

    @Override
    public boolean equals(Object o) {
        if (o == null)
            return false;
        if (!(o instanceof Employee))
            return false;
    
        Employee emp = (Employee) o;
        if (emp.name.equalsIgnoreCase(this.name))
            return true;
        else
            return false;
    }
    

5 个答案:

答案 0 :(得分:2)

您没有覆盖您需要执行的Object.equals(Object o)。你正在超载它。这就是它没有被召唤的原因。

请尝试使用此等于():

public boolean equals(Object o) {
    if (o == null)
        return false;
    if (!(o instanceof Employee))
        return false;

    Employee emp = (Employee) o;
    if (emp.name.equalsIgnoreCase(this.name))
        return true;
    else
        return false;
}

答案 1 :(得分:2)

  

在课程中,我重写了hashCode和Equals方法。   [...]   但是在添加或搜索散列映射时,两个方法都不会被调用   那么这些方法在hasmap方面的用途是什么?

如果您有Map<Key, Value>,并在该地图上致电putget,则会在{{1}上调用hashCodeequals }}类,而不是Key类。

在您的情况下,这意味着如果您执行Value,那么它会检查empmap.put(emp1.getId(), emp1);的哈希以及是否已经在地图中。因此,emp1.getId()类不会调用这些方法,这是正常的。

此外,如果Employee是&#34;唯一的&#34;属性,那么id应该基于那个(Employee.hashCode也应该与equals一致),并且如另一个答案所述,hashCode应该接受任何Employee.equals作为参数。

答案 2 :(得分:0)

我没有测试,但尝试用

HashMap<Integer, Employee> empmap=new HashMap<>();

甚至

HashMap<Integer, Employee> empmap=new HashMap<Integer, Employee>();

答案 3 :(得分:0)

使用流可以在Java 8中很好地完成。

empmap.values().stream().anyMatch(emp.getName().equals(searchedName)); 

这将获取地图中所有条目的集合,并查看该流是否与名称等于searchedName的任何条目匹配。

在类比中,您还可以使用Stream.filter()

获取所有匹配的名称

实现不同版本的equals / hashcode很棘手,因为它以多种方式改变了类的行为。

答案 4 :(得分:0)

解决您问题的最简单方法是将此方法添加到Employee类中。 默默地,HashMap使用值对象(在本例中为Employee)的equals(Object o)来检查该对象的存在。

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Employee employee = (Employee) o;

        if (name != null ? !name.equals(employee.name) : employee.name != null) return false;

        return true;
    }

注意,equals(Object o)的实现只适用于名称,不会检查其他字段。

Employee emp=new Employee();
emp.setId(10);
emp.setName("Maclean");
emp.setAge(240);

System.out.println(empmap.containsValue(emp));
System.out.println(emp1.equals(emp));

真 真