2016-09-07 17 views
-2
public class Test { 

    public void foo() { 

    ArrayList<Person> persons = new ArrayList<>(); 

    persons.add(new Person("Marco", "Bianchi")); 
    persons.add(new Person("Marco", "Rossi")); 
    persons.add(new Person("Marco", "Verdi")); 
    persons.add(new Person("Giacomo", "Bianchi")); 
    persons.add(new Person("Giacomo", "Rossi")); 
    persons.add(new Person("Giacomo", "Verdi")); 

    Map<String, List<String>> map = ?? 
} 

class Person { 
    String name; 
    String surname; 

    public String getName() { 
     return name; 
    } 
    public String getSurname() { 
     return surname; 
} 

私はNameが等しく、SurnameがリストにあるときMap<Name, List<Surname>>を持っている必要があります。 期待される結果:変換リスト<Object><attributeA、リスト<attributeB>

{マルコ= [ビアンキ、ロッシ、ヴェルディ]、ジャコモ= [ビアンキ、ロッシ、ヴェルディ]}

は、あなたが私を助けることができますか?

ラムダ関数解が必要です。そのような

+0

ヒント:詳細事項。次回:コンパイルするポストコード。実際、あなたの入力は正確に素晴らしい品質ではありません。ヘルプセンターを調べて、ここでどのように/どのように聞くべきかを理解してください。 – GhostCat

答えて

0

何か:

Map<String, List<String>> map = new HashMap<>(); 
for (Person p : people) { 
    List<String> surnames = map.get(p.getName()); 
    if (surnames == null) { 
     surnames = new ArrayList<>(); 
     map.put(p.getName(), surnames); 
    } 
    surnames.add(p.getSurname()); 
} 
0

はこれを試してみてください:

Map<String, List<String> map = new HashMap<>(); 
for (person aPerson : persons) { 
    List<String> surnames; 
    if (map.contains(aPerson.name)) { 
    surnames = map.get(aPerson.name); } 
    else { 
    surnames = new ArrayList<>(); 
    map.put(aPerson.name, surnames); 
    } 
    surnames.add(aPerson.surname; 
} 

しかし、もちろん、あなたのコードに向上させるために多くのもの:

  1. クラス名は大文字を起動します。常に。だからそれはする必要がありますP erson
  2. あなたのPersonクラスは、フィールドをプライベートにする必要があります。そのためのゲッターを持っています。
  3. あなたのPersonクラスは、妥当な方法でequals()とhashcode()を実装するべきでしょう。
+0

私は第1および第2のアドバイスに同意します。しかし、equals()とhashCode()を追加する理由は何ですか?人はハッシュテーブルのキーではありません。 – Max

+0

これは典型的な "価値"クラスのようです。ですから、遅かれ早かれ、それを持っていると便利です。それが私が「たぶん」と言った理由です。 – GhostCat

2

Java 8を使用している場合は、Stream APIをご覧ください。ここ は、それはあなたのタスクを解決することがいかに簡単であるかの例です:

public class MapExample { 

    public static void main(String[] args) { 
     ArrayList<Person> people = new ArrayList<>(); 

     people.add(new Person("Marco", "Bianchi")); 
     people.add(new Person("Marco", "Rossi")); 
     people.add(new Person("Marco", "Verdi")); 
     people.add(new Person("Giacomo", "Bianchi")); 
     people.add(new Person("Giacomo", "Rossi")); 
     people.add(new Person("Giacomo", "Verdi")); 

     Map<String, List<String>> map = people.stream() 
      .collect(
        Collectors.groupingBy(Person::getName, 
        Collectors.mapping(Person::getSurname, Collectors.toList())) 
      ); 
    } 
} 

静的インポートして、それはより宣言になります。

import static java.util.stream.Collectors.*; 

// .... 

Map<String, List<String>> map = people.stream() 
     .collect(
       groupingBy(Person::getName, mapping(Person::getSurname, toList())) 
     ); 
0

は、Apache共通MultiValuedMapを使用してみてください:

MultivaluedMap<String, Object> map = new MultivaluedHashMap<String, Object>(); 
map.put("Marco", "Bianchi"); 
map.put("Marco", "Rossi"); 
map.put("Marco", "Verdi"); 
map.put("Giacomo", "Bianchi"); 
map.put("Giacomo", "Rossi"); 
map.put("Giacomo", "Verdi"); 

マップから値を取得するには、それを繰り返すと、値のリストが得られます。

Set<String> keySet = map.keySet(); 
for(String key : keySet){ 
    System.out.println(key + " ==> " + map.get(key)); 
} 

出力: マルコ==> [ "ビアンキ"、 "ロッシ"、 "ヴェルディ"] ジャコモ==> [ "ビアンキ"、 "ロッシ"、 "ヴェルディ"]

・ホープ..これはあなたを助けるでしょう。 :D

関連する問題