Java 在未排序的数组中查找唯一的元素

Java 在未排序的数组中查找唯一的元素,java,arrays,java-stream,Java,Arrays,Java Stream,所以每个人都知道初学者有一个任务,你有一个排序数组,你需要找到唯一值的数量。例如,如果int[]sorted={0,0,1,1,2,2},结果是3个唯一值。我在想,如果我想对未排序的数组执行同样的操作,该怎么办。我知道我可以把它分类,让我的生活更轻松——但仍然如此 例如:int[]numbers={2,7,3,2,3,7,7}。我的第一个想法-我需要2个for循环来查找2的所有实例,而不是7,依此类推。这就是我怀疑的地方 正如你所看到的那样,7次重复,我想知道如何确保我不会数到两次。更准确地说,

所以每个人都知道初学者有一个任务,你有一个排序数组,你需要找到唯一值的数量。例如,如果
int[]sorted={0,0,1,1,2,2}
,结果是3个唯一值。我在想,如果我想对未排序的数组执行同样的操作,该怎么办。我知道我可以把它分类,让我的生活更轻松——但仍然如此

例如:
int[]numbers={2,7,3,2,3,7,7}
。我的第一个想法-我需要2个
for循环
来查找2的所有实例,而不是7,依此类推。这就是我怀疑的地方

正如你所看到的那样,7次重复,我想知道如何确保我不会数到两次。更准确地说,我需要某种标志,以表明我以前计算过该元素,但我不确定如何将其写下来


我怎样才能做到这一点?不一定是在代码中,也许只是一点如何做的提示?

对于循环,您不需要两个
,只需要一个
集合
,其中包含您遇到的数字。在循环中添加到集合中,最后,它包含在数组中找到的唯一数字。

使用hashmap。 键是数字,值是计数。 每次找到密钥时更新计数。
如果键不可用,则创建一个值为1的条目

您需要在一次迭代中将所有值添加到,这样可以根据其定义确保值是不同的。使用来维护订单。否则,我也会做好这项工作

new LinkedHashSet<Integer>(Arrays.asList(array)).toArray();

您可以使用只包含唯一值的
集合,因此如果将所有数组放入一个集合中,则可以得到集合的大小,即:)

您可以使用集合来获得唯一元素

int [] numbers = {2, 7, 3, 2, 3, 7, 7}

Set<Integer> uniqueValue = new HashSet<>(Arrays.asList(numbers));

最好的方法是使用整数集,如其他答案中所述

如果您正在寻找一个没有此功能的解决方案,以下是另一种方法:

如果您想使用两个for循环,为了避免重复,您可以在每次找到它时“擦除”2的所有实例,然后是7,依此类推。 例如,如果您: 1) 忽略所有0(因此不计算覆盖的重复项) 2) 首先检查数组中是否有0,这样就不会忽略数组中最初的0,并将其计为唯一数字


希望这足以让你了解它是如何完成的

您甚至不需要计数器:您可以使用
布尔值,其中“true”表示唯一性,“false”表示非唯一性:
map.compute(k,(k,old)->old==null)@AndyTurner-LOL,计时!我只是想说用
Set
代替
Map
。(一开始我误读了这个问题,它是为了找出每个数字出现的次数,但它只是找出数组中的数字。)甚至不需要旗帜。谢谢你,@nikolas,感谢你的详细回答
int [] numbers = {2, 7, 3, 2, 3, 7, 7}

Set<Integer> uniqueValue = new HashSet<>(Arrays.asList(numbers));
Arrays.stream(number).distinct().toArray();