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();