簡體   English   中英

如何合並 ArrayList 中的對象?

[英]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 ,這些實例(記錄)在數組中具有相似名稱的重復值。
  • 它使用 hashMap 來存儲名稱和域,如果它不存在,則利用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM