我的采访中提到了这一点:
从数组中打印重复值。
我将所有重复值存储在数组b中。最后将它们存储在哈希集中并打印哈希集。我将它们存储在哈希集中的唯一原因是因为我只需要重复项中的唯一值。就像我的数组中有{1,2,2,1}那么它应该只打印{1,2}。
下面的程序工作正常,但我为数组b分配了一个固定的大小(在下面的程序中大小= 100),我希望在运行时它的值应该用找到的重复数量更新。例如:如果我的数组中有10个重复值,那么b然后b应该变为10。
我在发布这个问题之前检查过很多,我也认为这可以用ArrayList完成,但我不知道怎么写数组b。
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class duplicate_values_hash {
public static void main(String aa[])
{
Integer a[] = {1, 2, 3, 1, 2, 4, 5, 1, 3, 8, 10, 11, 90, 8,12, 5, 4, 5, 8};
Arrays.sort(a);
Integer b[] = new Integer[100]; // How to update on runtime
int len,i,j = 0;
len = a.length;
for(i = 1; i < len; i++)
{
if(a[i-1] == a[i])
{
j = j + 1;
b[j] = a[i];
}
}
List<Integer> list = Arrays.asList(b);
HashSet hs = new HashSet();
hs.addAll(list);
System.out.println(hs);
}
}
答案 0 :(得分:1)
通过数组 a 大小动态分配:
public static void main(String aa[]) {
Integer a[] = {
1, 2, 3, 1, 2, 4, 5, 1, 3, 8, 10, 11, 90, 8, 12, 5, 4, 5, 8
};
Arrays.sort(a);
Integer b[] = new Integer[a.length]; // How to update on runtime
int len, i, j = 0;
len = a.length;
for (i = 1; i < len; i++) {
if (a[i - 1] == a[i]) {
b[j++] = a[i];
}
}
List<Integer> list = new ArrayList<Integer>(Arrays.asList(b));
list.removeAll(Collections.singleton(null));
HashSet hs = new HashSet();
hs.addAll(list);
System.out.println(hs);
}
答案 1 :(得分:0)
我认为这段代码做了同样的事情
public static void main(String aa[])
{
Integer a[] = {1, 2, 3, 1, 2, 4, 5, 1, 3, 8, 10, 11, 90, 8,12, 5, 4, 5, 8};
int len = a.length;
HashSet hs = new HashSet();
for(int i = 0; i < len; i++)
{
hs.add(a[i]);
}
System.out.println(hs);
}
答案 2 :(得分:0)
这个问题到底是什么?动态调整数组大小?别。或者使用ArrayList,因为它会调整大小。
是否要查找数组中有多少重复项?
Set<Integer> set = new HashSet<>();
for(int nextInt:myArrayOfPossibleDuplicates) {
set.add(nextInt);
}
for(int nextInt:set) {
System.out.println(nextInt);
}
System.out.println("There were " + myArrayOfPossibleDuplicates.length - set.size() + " additional items through duplication");
或者您是否正在尝试为每个项目处理多少重复项?用地图做到这一点。
Map<Integer, Integer> howManyOfEach = new HashMap<>();
for(int nextInt:myArrayOfPossibleDuplicates) {
if (!howManyOfEach.containsKey(nextInt)) {
howManyOfEach.put(nextInt, 1);
} else {
howManyOfEach.put(nextInt, howManyOfEach.get(nextInt) + 1);
}
}
for(Entry<Integer,Integer> item:howManyOfEach.entrySet()) {
System.out.println("Number " + item.key() + " -> " + item.value() + " time(s)");
}
现在你的采访已经结束,似乎有点无意义。
答案 3 :(得分:0)
for(i = 1; i < len; i++) { if(a[i-1] == a[i]) { j = j + 1; b[j] = a[i]; } }
你可以做这样的事情,并且它可能在给定正确的逻辑的情况下工作,但如果我正在寻找合适的Java程序员(而不是研究生程序员),这将是负分),因为这无法理解Java。
要查找重复的条目,我希望更像这样:
int nums[] = {1, 2, 3, 1, 2, 4, 5, 1, 3, 8, 10, 11, 90, 8,12, 5, 4, 5, 8};
Set<Integer> uniqueNums = new HashSet<>();
for (int num : nums) {
if (!uniqueNums.add(num)) {
System.out.println(num);
}
}
Set<E>
是一种仅存储唯一元素的数据结构。因此,如果您尝试添加已在集合中的值,Set.add(E)
将返回false
。
上面的循环遍历数字并尝试将每个数字添加到集合中。 uniqueNums.add(num)
返回false
的任何数字都是已在集合中的数字,因此重复。
以上代码打印出来。
1
2
1
3
8
5
4
5
8
1
,5
,8
打印两次,因为它们重复两次。 (即每人总共有三人。)
现在,如果您不想看到重复的副本,该怎么办? 答案:使用其他Set<E>
!