Объедините все хэш-карты, основываясь на одном и том же имени, в java 8 - PullRequest
0 голосов
/ 04 апреля 2020
public class PersonAgg {

    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        Map<String, Integer> age = new HashMap<>();
        Map<String, Integer> age2 = new HashMap<>();
        Map<String, Integer> age3 = new HashMap<>();
        Map<String, Integer> age4 = new HashMap<>();
        age.put("One", 1);
        age2.put("Two", 2);
        age3.put("Three", 3);
        age4.put("Four", 4);
        persons.add(new Person("Ajay", age));
        persons.add(new Person("Vijay", age2));
        persons.add(new Person("Ajay", age3));
        persons.add(new Person("Vijay", age4));

    }

}

class Person {

    public Person(String name, Map<String, Integer> age) {
        super();
        this.name = name;
        this.age = age;
    }

    private String name;
    private Map<String, Integer> age;

Теперь я хочу вывод как: {name : Ajay, HashMapValue : {age :["One",1],} age3 :["Three",3]}, {name : Vijay , HashMapValue : {age2 :["Two",2],} age4 :["Four",4]}

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Не идеально. Пожалуйста, не стесняйтесь улучшать этот ответ

public class Test
{
 public static void main(String args[])
 {
  List<Person> persons=List.of(new Person("Ajay",Map.of("One",1))
                              ,new Person("Vijay",Map.of("Two",2))
                              ,new Person("Ajay",Map.of("Three",3))
                              ,new Person("Vijay",Map.of("Four",4)));

  Map<String,List<String>> values=                     
                               persons.stream()
                              .collect(Collectors.groupingBy(p->" name : "+p.name+", HashMapValue: ",
                                       Collectors.mapping(p2->p2.age.entrySet().stream(),
                                       Collectors.flatMapping(ages->ages.map(entry->get(entry))
                                      ,Collectors.toList())))
                                    );


  System.out.println("{");
  values.entrySet().forEach((value)->
  {
   System.out.print(value.getKey());
   value.getValue().forEach((age)->System.out.print(age+","));
   System.out.println();
  });
  System.out.println("}");
 }

 private static String get(Entry<String,Integer> entry)
 {
  String map;

  switch(entry.getKey())
  {
   case "One":map="age";
   break;
   case "Two":map="age2";
   break;
   case "Three":map="age3";
   break;
   default:map="age4";
  }

  return map+" :["+entry.getKey()+","+entry.getValue()+"]";
 }

 private static class Person
 {
  private final String name;
  private final Map<String,Integer> age;

  private Person(String name,Map<String,Integer> age)
  {
   this.name=name;
   this.age=age;
  }
 }

Вывод:

{
 name : Ajay, HashMapValue: age :[One,1],age3 :[Three,3],
 name : Vijay, HashMapValue: age2 :[Two,2],age4 :[Four,4],
}
0 голосов
/ 04 апреля 2020

Вы можете попробовать что-то вроде этого:

Map<String, Map<String, Integer>> grouped = persons.stream()
    .collect(toMap(Person::getName, Person::getAge, (p1, p2) -> {
        p1.putAll(p2);
        return p1;
    }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...