2016-12-10 4 views
0

私はクラスPersonを持ち、そのクラスのオブジェクトをいくつか作ったとしましょう。そして、私はキーとしてPersonを保持し、ValueとしてStringを保持するマップを作成します。マップ内のキーがオブジェクトの場合、そのオブジェクトの属性でどのように検索しますか?

import java.util.HashMap; 
import java.util.Map; 

public class Ex03{ 

public static void main(String[] args) { 

    new Ex03(); 

} 

public Ex03(){ 

    Person person1 = new Person("Name1", "LastName1", "Address1"); 
    Person person2 = new Person("Name2", "LastName2", "Address2"); 
    Person person3 = new Person("Name3", "LastName3", "Address3"); 
    Person person4 = new Person("Name4", "LastName4", "Address4"); 

    Map<Person, String> map = new HashMap<>(); 
    map.put(person1, "12345678901"); 
    map.put(person2, "12345678902"); 
    map.put(person3, "12345678903"); 
    map.put(person4, "12345678904"); 

    findNumber(map, "Name1"); 

} 

public void findNumber(Map<Person, String> map, String name){ 

} 


class Person { 
    String name, lastName, address; 

    public Person(){ 

    } 

    public Person(String name, String lastName, String address){ 

     this.name = name; 
     this.lastName = lastName; 
     this.address = address; 

    } 

    @Override 
    public String toString() { 
     return "Person [name=" + name + ", lastName=" + lastName + ", address=" + address + "]"; 
    } 



} //end of class Person 

} 

私はどのように:私は名前を取り、その名前を持つ人を探し、名前をここで

が私のコードであることを持っていたキーの値を出力する方法を作りたいですメソッドfindNumber()を作成しますか? 要約:文字列名を入力すると、その名前を持つPersonオブジェクトが見つかり、入力した名前のPerson Keyにバインドされている値が出力されます。

答えて

0

Personオブジェクトに別の名前のマップを保存しない限り、マップのkeySetをループして各キーと文字列を比較する必要があります。

0

次に、PersonをKey、StringをValueとして保持するマップを作成します。私はそれを作るために、名前を取り、 その名前を持つ人を探し、要件の名前

両方が矛盾していることを持っていたキーの値を出力する方法を作りたい 実際には、nameという値をのキーとしてPersonのオブジェクトと値としてキーを格納することができます(逆順にしています)。

オプション(1):などのHashMapの値とキーと人物として名前

これは、一般的に、我々はすなわち何をすべきかである、マッピングオブジェクトの文字列、整数などの単純なキーに、

Map<String,Person> map = new HashMap<>(); 
map.put("John", person1); 
//add other objects 
キーと名前Aとしてパーソン:

public void findNumber(Map<Person, String> map, String name){ 
    Person person = map.get(name); 
} 

オプション(2):

は今すぐ下記findNumber()を見て

Map<Person, String> map = new HashMap<>(); 
map.put(person1, "John"); 
//add other objects 

のHashMapでS値は今すぐ下記findNumber()を見て:働くには、このオプション(2)については

public void findNumber(Map<Person, String> map, String name){ 
     Set<Person> keys = map.keySet(); 
     for(Person person : keys) { 
      if(person.getName().equals(name)) { 
       String name = map.get(person); 
       break; 
      } 
     } 
} 

は、あなたのPersonクラス内オーバーライドequals()hashcode()する必要があります。

また、サイドノートとして、コンストラクタはインスタンス変数の初期化のために意図されていることを覚えておいてください、あなたはベストプラクティスではありませんあなたのコード(のようなEx03())、内部でコンストラクタ内部のロジックのあまりを書いています。

0

コードを以下のように変更してください...

public Ex03(){ 

    Person person1 = new Person("Name1", "LastName1", "Address1"); 
    Person person2 = new Person("Name2", "LastName2", "Address2"); 
    Person person3 = new Person("Name3", "LastName3", "Address3"); 
    Person person4 = new Person("Name4", "LastName4", "Address4"); 

    Map<String, Person> map = new HashMap<>(); 
    map.put("Name1", person1); // or map.put(person1.name, person1); 
    map.put("Name2", person2); 
    map.put("Name3", person3); 
    map.put("Name4", person4); 

    findPerson(map, "Name1"); 

} 

public Person findPerson(Map<String, Person> map, String name){ 
    Person person = map.get(name); 
} 

編集:あなたは人の数を格納する場合

は、あなたが以下のようにあなたの人のクラスでそれを追加する必要があります。

public Ex03(){ 

    Person person1 = new Person("Name1", "LastName1", "Address1", "12345678901"); 
    Person person2 = new Person("Name2", "LastName2", "Address2", "12345678902"); 
    Person person3 = new Person("Name3", "LastName3", "Address3", "12345678903"); 
    Person person4 = new Person("Name4", "LastName4", "Address4", "12345678904"); 

    Map<String, Person> map = new HashMap<>(); 
    map.put("Name1", person1); // or map.put(person1.name, person1); 
    map.put("Name2", person2); 
    map.put("Name3", person3); 
    map.put("Name4", person4); 

    String number = findNumber(map, "Name1"); 

} 

public String findNumber(Map<String, Person> map, String name){ 
    String number = map.get(name).number; 
} 

class Person { 
    String name, lastName, address, number; 

    public Person(){ 

    } 

    public Person(String name, String lastName, String address, String number){ 

     this.name = name; 
     this.lastName = lastName; 
     this.address = address; 
     this.number = number; 
    } 

    @Override 
    public String toString() { 
     return "Person [name=" + name + ", lastName=" + lastName + ", address=" + address + ", number=" + number"]"; 
    }  

} //end of class Person 
関連する問題