你可以像在ArrayList中一样遍历HashMap吗?

时间:2015-01-18 10:37:49

标签: java arraylist hashmap java-collections-api

你可以像在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中的其他人不一样?

4 个答案:

答案 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类必须覆盖hashCodeequals方法。如果姓名和年龄相等,equals应该返回true。 hashCode应该返回一个取决于nameage的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()通过传递名称来获取会员的年龄。希望它有所帮助。