class A {
private String aProp;
private String bProp;
private String cProp;
public A(String aProp, String bProp, String cProp) {
this.aProp = aProp;
this.bProp = bProp;
this.cProp = cProp;
}
public String getaProp() {
return aProp;
}
public String getbProp() {
return bProp;
}
public String getcProp() {
return cProp;
}
}
List<A> listOfA = List.of(new A("r", "b", "c"), new A("r", "b", "d"),
new A("t", "b", "e"), new A("t", "c", "f"),
new A("r", "d", "g"), new A("w", "b", "j"));
这是你要的东西。
Map<String, Map<String, String>> map = new HashMap<>();
for (A a : listOfA) {
map.computeIfAbsent(a.getaProp(), v -> new HashMap<>())
.put(a.getbProp(), a.getcProp());
}
map.entrySet().forEach(System.out::println);
System.out.println();
印刷品
r={b=d, d=g}
t={b=e, c=f}
w={b=j}
请注意,由于A的示例具有重复的aProp's和bProp's,因此遇到的下一个示例替换了前一个示例。在前面的示例中,b,d for r替换了b,c for r。 为了防止这种情况,如果需要,您可以创建一个ArrayList<String>作为内部Map的值。
Map<String, Map<String, List<String>>> map2 = new HashMap<>();
for (A a : listOfA) {
map2.computeIfAbsent(a.getaProp(), v -> new HashMap<>())
.computeIfAbsent(a.getbProp(), v -> new ArrayList<>())
.add(a.getcProp());
}
map2.entrySet().forEach(System.out::println);
3条答案
按热度按时间tquggr8v1#
假设
aProp
和bProp
的组合是唯一的:如果
aProp
和bProp
的示例具有相同的值,则toMap
收集器将引发异常。如果发生这种情况,您可以使用其他toMap
方法之一。例如,toMap(a -> a.bProp, a -> a.cProp, (x, y) -> y))
将采用最后一个值(尽管顺序并不能保证“最后一个值”是什么)。7lrncoxx2#
您可以在
List<A>
上创建一个for循环,为每次迭代添加一个新的map条目。示例输出
goucqfw63#
这是你要的东西。
印刷品
请注意,由于
A
的示例具有重复的aProp's
和bProp's
,因此遇到的下一个示例替换了前一个示例。在前面的示例中,b,d for r
替换了b,c for r
。为了防止这种情况,如果需要,您可以创建一个
ArrayList<String>
作为内部Map的值。印刷品
在这个例子中,
c
被保留在ArrayList中。