0

你能像在 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 的姓名和年龄是否与成员哈希图中的另一个人不同?

4

4 回答 4

3

为什么要循环?您可以简单地测试密钥的存在:

if( members.containsKey( name ) ){
  // duplicate
}

但是,您可以迭代:

for( Map.Entry<String,Integer> e: members.entrySet() ){
     // use e.getKey(), e.getValue()
}

之后

由于鲍里斯提出了这个问题:

Map<String,Person> members

将是一种将名称集映射到 Person 集的方法。如果年龄也有助于区分 Persons,则必须注意 Boris 提示:将 hashCode 和 equals 添加到 Person (都使用 name 和 age 来 hashCode 比较和比较),然后你可以这样做

Set<Person> members

members.contains( p ) 会告诉你一个相等的 Person 是否已经是一个成员。

于 2015-01-18T10:42:02.723 回答
1

HashMap 从来没有重复的键。我建议将 ArrayList 与 Persons 一起使用,并在您的 Person 类中实现 equal 方法来检查 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;
}
于 2015-01-18T10:56:36.590 回答
0

因此,对于您的 arrayList 解决方案,您可以为您的 Person 类覆盖 equals 和哈希码,这样您就不必循环您可以调用 contains() 方法,通过传递直接创建的 Person 对象,如下所示contains(new Person("name", "age")),这样就可以轻松查找成员是否存在于列表中。

您可以在 equals 方法实现中使用您提到的相同逻辑。

 if (membs.getName().equals(name) && membs.getAge()==age)

如果你想要我建议不要使用的 hashmap,但同样,你也不需要循环 hashmap,但可以使用 containsKey 来验证是否存在相同的成员或调用 get() 来获取年龄您的成员通过传递名称。希望能帮助到你。

于 2015-01-18T11:09:08.873 回答
0

在 HashMap 中,键不能重复,因此您不必为此目的遍历 Map。在您的HashMap<String, Integer>中,同名不能出现多次。

有一些方法可以遍历 Map 的键 ( keySet())、值 ( values()) 或条目 ( entrySet()),但您不需要它们来达到您所说的目的。

给定您编辑,您想检查Person您创建的新内容是否包含在 Map 中:

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应该返回一个依赖于nameand的 int 值age(这样如果对于两个 Person p1 和 p2 p1.equals(p2)then p1.hashCode()==p2.hashCode())。

于 2015-01-18T10:42:09.333 回答