当前位置: 首页 > 知识库问答 >
问题:

合并两个重复的Java Arraylists

农诚
2023-03-14

我试图通过合并另外两个列表来生成ArrayList。我允许重复对象,但是我的结果ArrayList必须包含两个初始列表之间的差异。我意识到这听起来可能很复杂,所以这里有一个例子:

ArrayList 1:[obj1,obj1,obj1,obj2,obj4,obj4]
ArrayList 2:[obj1,obj2,obj2,obj3]

我觉得这应该很简单,但我似乎想不通。我将使用ArrayList1.RemoveAll(ArrayList2),但是每个对象都有自己的ID,所以我认为我不会检测到它们是同一个对象。

编辑:修正了结果ArrayList中的一个错误
谢谢!

共有1个答案

柴泰平
2023-03-14

只需使用一个hashmap,将一个元素映射到它在清单1中出现的次数,并为清单2映射另一个hashmap,然后创建一个新的arraylist并添加Objxn次,其中n=abs(hashmap1.get(objx)-hashmap2.get(objx))。

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        List<Integer> list1 = Arrays.asList(new Integer[] { 1, 1, 1, 2, 4, 4 });
        List<Integer> list2 = Arrays.asList(new Integer[] { 1, 2, 2, 3 });
        HashMap<Integer, Integer> hashMap1 = new HashMap<>();
        HashMap<Integer, Integer> hashMap2 = new HashMap<>();
        for (Integer i : list1) {
            if (hashMap1.containsKey(i)) {
                hashMap1.put(i, hashMap1.get(i) + 1);
            } else {
                hashMap1.put(i, 1);
            }
        }
        for (Integer i : list2) {
            if (hashMap2.containsKey(i)) {
                hashMap2.put(i, hashMap2.get(i) + 1);
            } else {
                hashMap2.put(i, 1);
            }
        }
        HashSet<Integer> dedup = new HashSet<>();
        for (Integer i : list1) {
            dedup.add(i);
        }
        for (Integer i : list2) {
            dedup.add(i);
        }
        ArrayList<Integer> result = new ArrayList<>();
        for (Integer i : dedup) {
            Integer n1 = hashMap1.get(i);
            Integer n2 = hashMap2.get(i);
            int n = Math.abs((n1 == null ? 0 : n1) - (n2 == null ? 0 : n2));
            for (int j = 0; j < n; ++j) {
                result.add(i);
            }
        }
        for (Integer i : result) {
            System.out.println(i);
        }
    }
}
 类似资料:
  • 给定两个已排序的链表,其中的结果应为并集,不重复。 不允许创建新节点 输入是两个由空行分隔的列表: L1级- L2级- 结果- 下面是我的解决方案,但在Union函数中创建新节点。 有没有什么简单的方法可以通过不创建任何新节点并删除重复节点的逻辑来更改Union函数?

  • 问题内容: 这个问题已经在这里有了答案 : 在Java中将两个arrayList合并到一个新的arrayList中,没有重复且没有顺序 (14个答案) 7年前关闭。 我有两个arrayLists 我想要我的最终ArrayList,其中将包含一个元素的 所有 元素以及仅包含两个元素而不包含一个元素的元素。 因此ArrayList final = {A,B,C,D,E,F,G}。 我怎样才能做到这一点

  • 我有两列,一列有年份,另一列有月份数据,我正试图从中创建一列(包含年份和月份)。 示例: 我想拥有 我试过了 但它给了我“无法从重复轴重新编制索引”错误。

  • 我想同时执行两个流,并生成作为前两个流的组合的第三个流 我想从这两个中生成一个新的,它将与这一个等价 我目前找到的是或

  • 我一直在为我的服务器做一个非常简单的bukkit插件,只是为了个人使用。我做了一个叫播放器的命令,当某人有权限(broadcaster.players)时,它会显示服务器播放器的列表。我还想让它在游戏中显示玩家的游戏模式。但是我不知道如何把它们放在一起。 我的代码: 如果它说,我想在同一行上显示游戏模式。 当然,这从来没有工作过,我不知道该怎么办,有人能给我建议我能做什么吗,我的代码很混乱,但我是

  • 有两个数组: 我是如何做到的: 我想用RxJ或其他。 如果值不是数字,例如Object。