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函数解决方案。
答案 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;
}
但当然,您的代码需要改进很多内容:
答案 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