如何在没有克隆的情况下从 ArrayList 获取唯一元素

How to get unique elements from ArrayList without clone

我正在尝试从另一个具有重复元素的 ListArrayB 制作一个唯一的 ListArrayA。 ListArrayA 和 ListArrayB 是单独定义的。列表 B 已经填满了数据,其中包含大约 10000 个整数。

我创建了一个名为 unique() 的函数并使用了以下逻辑。而运行这个逻辑,程序是永无止境的。我想知道这是非常简单和小的逻辑,但这仍然不起作用。静态声明有问题吗?

基本上,我想从 ListB 创建一个新的 Array/ArrayList,这样我在列表 A 中就有了独特的元素。我不想丢失列表 B。我想保持列表 B 不变。

我该怎么做?我听说克隆另一个列表,然后进行基本搜索以创建一个新列表。我不克隆(复制)以保持效率。

我也听说过HashSet。但我不想克隆列表 B 的副本,也不想丢失列表 B 的内容。 [清单 B 应保持原样]。我怎样才能实现它?

static ArrayList<Integer> a = new ArrayList<Integer>();
static ArrayList<Integer> b = new ArrayList<Integer>();
function unique(){
  a.add(b.get(0));
  for(int i=1;i<b.size();i++){
        for(int m=0;m<a.size();m++){
            if(b.get(i)!=a.get(m)){
                a.add(b.get(i));
            }
        }
    }
}

我想到的 HashSet 的代码。但是我无法从中访问元素。

static Set<Integer> uniqueElem;

然后在函数调用中我用以下命令初始化它:

uniqueElem = new HashSet<Integer>(b);

请帮忙!提前致谢!

这样可以吗?

ArrayList<Integer> a = new ArrayList<>(new HashSet<>(b));

请记住,您没有很好地解释您的问题或约束条件。

您可以在 O(n) 时间内找到列表中的唯一元素,方法是逐步遍历列表,并将存在的元素添加到 HashMap。它可以是 HashMap<Integer,Integer>,第二个值是该值出现的次数,如果你关心的话。

构建 HashMap 后,您可以通过 HashMap.get(Integer value) 查询 "does this element exist" 问题,这将 return null,如果答案是"no."

或者,如果您只想查看这些值是什么,请通过 HashMap.keySet() 打印出键集 return。