[英]JAVA: How do I merge objects from an arrayList based on a property value?
[英]How do I merge Objects in a ArrayList?
我有一個名為變量(ArrayList-Variable-)的對象的 arraylist ( - 代替了 <,否則會觸發引用)。 這個變量 object 有兩個字段:name 和 domain,其中 name 是 String,domain 是 int 數組。 我想合並具有相同名稱的變量,特別是我希望有一個具有該名稱的變量,並且域等於具有相同名稱的變量的所有域的聯合(不重復)。
例如:
ArrayList:[VarA:1,VarA:6,VarB:9,VarB:3,VarA:4,VarC:2,VarC:1]
我想要的是:[VarA:{1,6,4},VarB:{9,3},VarC:{2,1}]
我怎樣才能做到這一點?
您可以簡單地使用HashMap來存儲此類數據假設您的ArrayList的變量是arr然后:-
HashMap<String, Set<Integer>> map = new HashMap<>();
for(Variable var:arr) {
Set<Integer> set = map.getOrDefault(var.name, new HashSet<Integer>());
set.add(var.domain);
map.put(var.name, set);
}
然后map ( HashMap ) 將包含所需的結果,如果需要,您可以再次轉換為ArrayList 。
我會使用列表的 Hashmap 來實現這一點。
for (Tuple item: list) {
if (!map.containsKey(item.key)) {
map.put(item.key, new LinkedList<String>());
}
map.get(item.key).add(item.value);
}
然后使用 map.values(),您可以恢復值列表的集合。
使用 Java 8 Stream 您可以執行以下操作:
Map<String, Set<Integer>> result = v.stream().collect(
Collectors.groupingBy(Variable::getDomain,
HashMap::new, Collectors.mapping(Variable::getVal, Collectors.toSet()))
);
測試代碼:
List<Variable> v = new ArrayList<Variable>();
v.add(new Variable("A", 1));
v.add(new Variable("A", 2));
v.add(new Variable("B", 4));
v.add(new Variable("C", 7));
v.add(new Variable("C", 7));
Map<String, Set<Object>> result = v.stream().collect(
Collectors.groupingBy(Variable::getDomain,
HashMap::new, Collectors.mapping(Variable::getVal, Collectors.toSet()))
);
System.out.println(result);
Output: {A=[1, 2], B=[4], C=[7]}
變量 Class:
class Variable {
private String domain;
private int val;
public Variable(String domain, int val) {
this.domain = domain;
this.val = val;
}
/**
* @return the domain
*/
public String getDomain() {
return domain;
}
/**
* @param domain
* the domain to set
*/
public void setDomain(String domain) {
this.domain = domain;
}
/**
* @return the val
*/
public int getVal() {
return val;
}
/**
* @param val
* the val to set
*/
public void setVal(int val) {
this.val = val;
}
}
你已經有清單了嗎? 您可以使用分組依據。
Map<String, List<Integer>> grouped = list.stream().collect( Collectors.groupingBy( Variable::getGroup ) );
List
,這些實例(記錄)在數組中具有相似名稱的重復值。computeIfAbsent
首先創建集合,否則,將 arrays 添加到其中。 該集合的目的是消除重復。// 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。
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
收集器將域 arrays 組合成每個名稱的集合。
Map<String,Set<Integer>> result = vars.stream().collect(
Collectors.groupingBy(v->v.getName(),
Collectors.flatMapping(
v->Arrays.stream(v.getDomain()),
Collectors.toSet())));
這產生與上面相同的結果。 上述兩個示例都假設使用 Integer 數組來保存域項。 List<Integer>
會更好。 Arrays.asList
或 stream 操作不容易支持原始 arrays,但有一些解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.