你可以像在ArrayList中一样遍历HashMap吗? 所以如果我有一类人物:
public class Person
{
private String name;
private int age;
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
然后有一个成员资格类,并使用数组列表我可以确保不重复该名称:
import java.util.ArrayList;
public class Memberships
{
private ArrayList<Person> members;
public Memberships()
{
ArrayList<Person> members = new ArrayList<Person>();
}
public void addMember(String name, int age)
{
Person p = new Person(name, age);
for (Person membs : members)
{
if (membs.getName().equals(name) && membs.getAge()==age)
{
return;
}
}
members.add(p);
}
}
但是,如果我想使用哈希映射代替名称和年龄:
HashMap<String, Integer> members = new HashMap<String, Integer>();
然后我想做同样的事情,检查名称和年龄与其他情况不一样,我可以使用循环检查吗?
public class Memberships
{
private HashMap<String, Integer> members;
public Memberships()
{
members = new HashMap<String, Integer>();
}
public void addMember(String name, int age)
{
members.put(name, age);
}
}
我知道这有点奇怪的做法,我只是想了解HashMaps。
好的,然后我改变了它,所以:
HashMap<Person, ID> members = new HashMap<Person, ID>();
然后我想:
public void addMember(String name, int age)
{
Person p = new Person (name, age);
members.put(p, id);
//**Say the id is a randomly generated number, that I don't really care about now
}
我如何检查人员p的名称和年龄与成员hashmap中的其他人不一样?
答案 0 :(得分:3)
为什么要循环?您只需测试是否存在密钥:
if( members.containsKey( name ) ){
// duplicate
}
你可以迭代:
for( Map.Entry<String,Integer> e: members.entrySet() ){
// use e.getKey(), e.getValue()
}
<强>后来强>
自从鲍里斯提出这个问题后:
Map<String,Person> members
是将名称集映射到Person集的方法。如果age也应该有助于区分Persons,那么必须注意Boris提示:添加hashCode并等于Person(使用name和age来hashCode comp和比较),然后就可以了
Set<Person> members
和members.contains(p)将告诉您一个人是否已经是一个成员。
答案 1 :(得分:1)
HashMap永远不会有重复的密钥。我建议将ArrayList与Persons一起使用,并在Person类中实现一个相等的方法,以检查ArrayList中是否有重复的对象。
@Override public boolean equals(Object other) {
boolean result = false;
if (other instanceof Person) {
Person otherPerson = (Person) other;
result = (this.getName() == otherPerson.getName() && this.getAge() == otherPerson.getAge());
}
return result;
}
答案 2 :(得分:0)
在HashMap中,密钥不能重复,因此您不必为此目的迭代Map。在HashMap<String, Integer>
中,相同的名称不会出现多次。
有一些方法可以迭代地图的密钥(keySet()
),值(values()
)或条目(entrySet()
),但您不需要它们你说的目的。
鉴于您的编辑,您想要检查您创建的新Person
是否包含在地图中:
public void addMember(String name, int age)
{
Person p = new Person (name, age);
if (members.containsKey (p) {
members.put(p, id);
}
}
为此,您的Person类必须覆盖hashCode
和equals
方法。如果姓名和年龄相等,equals
应该返回true。 hashCode
应该返回一个取决于name
和age
的int值(如果是两个人p1和p2 p1.equals(p2)
,那么p1.hashCode()==p2.hashCode()
)。
答案 3 :(得分:0)
因此,对于您的arrayList解决方案,您可以覆盖Person类的equals和hashcode,这样您就不必循环,可以通过传递直接创建的Person对象来调用contains()方法,如下所示{ {1}}因此很容易找到成员是否出现在列表中。
您可以在equals方法实现中使用您提到的相同逻辑。
contains(new Person("name", "age"))
如果你想要我建议不要使用的hashmap,但同样你也不需要循环hashmap,但是可以使用containsKey来验证是否存在相同的成员或者调用get()通过传递名称来获取会员的年龄。希望它有所帮助。