- 这会创建一些实例(记录)的
List,这些实例(记录)在数组中具有相似名称的重复值。
- 它使用 hashMap 来存储名称和域,利用
computeIfAbsent 如果它不存在则首先创建集合,否则,将数组添加到其中。该集合的目的是消除重复。
// your list of objects each with a name and Integer[] domain
List<Variable> vars = List.of(new Variable("var1", 1, 2, 3),
new Variable("var2", 4, 5, 6), new Variable("var1", 1, 9, 10),
new Variable("var5", 1, 6, 8), new Variable("var2", 4, 8, 9));
Map<String, Set<Integer>> result = new HashMap<>();
for (Variable v : vars) {
result.computeIfAbsent(v.name, k -> new HashSet<>())
.addAll(Arrays.asList(v.domain));
}
result.entrySet().forEach(System.out::println);
打印
var5=[1, 6, 8]
var2=[4, 5, 6, 8, 9]
var1=[1, 2, 3, 9, 10]
根据您的描述的变量类。
class Variable {
private String name;
private Integer[] domain;
public Variable(String name, Integer... domain) {
super();
this.name = name;
this.domain = domain;
}
public String getName() {
return name;
}
public Integer[] getDomain() {
return domain;
}
}
您也可以使用流来实现。我选择使用flatMapping 收集器将域数组组合成每个名称的集合。
Map<String,Set<Integer>> result = vars.stream().collect(
Collectors.groupingBy(v->v.getName(),
Collectors.flatMapping(
v->Arrays.stream(v.getDomain()),
Collectors.toSet())));
这会产生与上面相同的结果。上述两个示例都假设一个整数数组来保存域项。 List<Integer> 会更好。 Arrays.asList 或流操作不容易支持原始数组,但有一些变通方法。