Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 即使userdefind对象值相同,如何从hashmap中获取单个条目_Java_Collections - Fatal编程技术网

Java 即使userdefind对象值相同,如何从hashmap中获取单个条目

Java 即使userdefind对象值相同,如何从hashmap中获取单个条目,java,collections,Java,Collections,我有hashmap,这个人有一个整数值,我在映射中放了两个person对象,我只需要一个条目 class Employee{ private int id; public Employee(int i) { // TODO Auto-generated constructor stub this.id = i; } } public class HashMapExample { public static void main(S

我有hashmap,这个人有一个整数值,我在映射中放了两个person对象,我只需要一个条目

class Employee{
    private int id;
    public Employee(int i) {
        // TODO Auto-generated constructor stub
        this.id = i;
    }
}

public class HashMapExample {

    public static void main(String[] args) {
        HashMap<Employee,Integer> map =new HashMap<Employee,Integer>();
        map.put(new Employee(101),10);
        map.put(new Employee(101),20);

        System.out.println(map);
        Employee emp;
        for(Map.Entry<Employee,Integer> entry : map.entrySet()){
            System.out.println(entry.getKey()+"  "+entry.getValue());
             emp = entry.getKey();
            System.out.println(emp.equals(emp));
            emp.hashCode();

        }
    }

}
class员工{
私有int-id;
公职人员(国际一级){
//TODO自动生成的构造函数存根
这个id=i;
}
}
公共类HashMapExample{
公共静态void main(字符串[]args){
HashMap=newHashMap();
地图放置(新员工(101),10);
地图放置(新员工(101),20);
系统输出打印项次(map);
员工环境管理计划;
对于(Map.Entry:Map.entrySet()){
System.out.println(entry.getKey()+“”+entry.getValue());
emp=entry.getKey();
系统输出println(emp等于(emp));
emp.hashCode();
}
}
}

我需要从这两个条目中获得一个条目。

因为HashMap在内部使用哈希表,所以不可能,如果需要这种行为,需要在employee类中实现hashcode和equals方法,这些方法必须为同一对象返回不同的值(在您的情况下)对象来实现您想要的。

我不是很确定您想要什么,但假设Shmosel的猜测是正确的,您只想确保第二个
put
覆盖第一个,您可以在
Employee
类中重写
对象的
equals
hashCode
方法:

import java.util.HashMap;

class Employee{
    private int id;
    public Employee(int i) {
        this.id = i;
    }
    public int getId()
    {
        return id;
    }
    @Override
    public boolean equals(Object o) {
        return this.id == ((Employee) o).id;
    }
    @Override
    public int hashCode() {
        Integer idInt = new Integer(id);
        return idInt.hashCode();
    }
}
public class HashMapExample {
    static HashMap<Employee,Integer> hm = new HashMap<>();
    public static void main(String args[]) {
        hm.put(new Employee(100),10);
        hm.put(new Employee(100), 20);
        hm.put(new Employee(200), 50);
        for (Employee e: hm.keySet()) {
            System.out.println("Employee " + e.getId() + ", value = " + hm.get(e));
        }



    }
}

不能将同一个键映射到2个值。你想做什么?啊,你想理解为什么它没有被覆盖,是吗?你需要实现
equals()
hashCode()
Employee
中的
将其用作一个键。@shmosel在试图理解一个措辞模糊的问题时做得非常出色。请解释你想做什么以及你到底面临什么问题。我很好奇你认为OP试图做什么。我认为OP试图理解为什么第二个
put
没有覆盖首先,正如您所猜测的,您能否共享一些示例代码库,以便它对您的应用程序有所帮助me@DavidChoweller不,大卫,你所理解的与OP所想的不同。谢谢@David,这就是我所期待的。
Employee 100, value = 20
Employee 200, value = 50