在Map <attributea,list <attributeb>中转换List <object>

时间:2016-09-07 11:30:31

标签: java lambda java-8 mapping

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; 
}

Map<Name, List<Surname>>相等且Name位于列表中时,我需要Surname。 预期结果:

  

{Marco = [Bianchi,Rossi,Verdi],Giacomo = [Bianchi,Rossi,Verdi]}

你能帮助我吗?

我需要lambda函数解决方案。

4 个答案:

答案 0 :(得分: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()))
        );

答案 1 :(得分: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());
}

答案 2 :(得分: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. 类名称启动UpperCase。总是。所以它应该是 P erson
  2. 您的Person类应该将其字段设为私有;并且有吸气剂。
  3. 你的Person类应该以合理的方式实现equals()和hashcode()。

答案 3 :(得分:0)

尝试使用apache common 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));
}

输出: Marco ==&gt; [&#34; Bianchi的&#34;&#34;罗西&#34;&#34;威尔第&#34;] Giacomo ==&gt; [&#34; Bianchi的&#34;&#34;罗西&#34;&#34;威尔第&#34;]

希望......这会对你有所帮助。 :d