0

ArrayList のように HashMap をループできますか? したがって、 Person のクラスがある場合:

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

名前セットを人物セットにマッピングする方法です。年齢も人を区別するのに役立つ場合は、ボリスのヒントに注意する必要があります: 人に hashCode と equals を追加します (name と age の両方を使用して hashCode の比較と比較を行います)。

Set<Person> members

members.contains( p ) は、等しい Person が既にメンバーであるかどうかを示します。

于 2015-01-18T10:42:02.723 に答える
1

HashMap には重複したキーはありません。Persons で ArrayList を使用し、ArrayList に重複したオブジェクトがあるかどうかを確認するために、Person クラスに equal メソッドを実装することをお勧めします。

@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

HashMap では、キーを繰り返すことはできないため、その目的で Map を反復処理する必要はありません。ではHashMap<String, Integer>、同じ名前を複数回表示することはできません。

keySet()Map のキー ( )、値 ( 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);
    }
}

hashCodeこれが機能するには、Person クラスでメソッドとメソッドをオーバーライドする必要がありequalsます。equals名前と年齢の両方が等しい場合、true を返す必要があります。andhashCodeに依存する int 値を返す必要があります(2 人の人物 p1 と p2 thenの場合)。nameagep1.equals(p2)p1.hashCode()==p2.hashCode()

于 2015-01-18T10:42:09.333 に答える
0

contains(new Person("name", "age"))したがって、arrayList ソリューションの場合、Person クラスの equals と hashcode をオーバーライドできるため、次のように直接作成された Person オブジェクトを渡すことで、contains() メソッドを呼び出すことができ、ループする必要がなくなります。メンバーがリストに存在するかどうかを調べます。

equals メソッドの実装で言及したのと同じロジックを使用できます。

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

また、私が行かないようにアドバイスするハッシュマップが必要な場合でも、同様にハッシュマップをループする必要はありませんが、containsKey を使用して同じメンバーが存在するかどうかを確認するか、get() を呼び出して年齢を取得できます。名前を渡すことにより、あなたのメンバーの。それが役に立てば幸い。

于 2015-01-18T11:09:08.873 に答える