我需要通过将原始数组中没有重复的元素添加到新数组并从中输出内容来删除数组中的重复元素。
我遇到的问题是,当打印出没有重复的新数组时,也会输出零。
因此:Java是否用零填充数组?
public static boolean hasDuplicates(int arrayNum[])
{
boolean dupFound = false;
int ctr1 =0;
while (ctr1<arrayNum.length && !dupFound)
{
int ctr2 = ctr1+1; // be 1 ahead each time ctr1 increments
while(ctr2<arrayNum.length)
{
if(arrayNum[ctr1] == arrayNum[ctr2])
dupFound = true;
ctr2++;
}
ctr1++;
}
return dupFound;
}
public static int[] removeDuplicates(int[] arrayNum)
{
if(hasDuplicates(arrayNum) == false)
return arrayNum;
else
{
int outArray[] = new int[arrayNum.length];
int ctr1=0;
int ctr2 = ctr1+1;
int index = 0;
boolean dupFound = false;
while(ctr1<arrayNum.length)
{
dupFound = false;
ctr2 = ctr1+1;
while(ctr2<arrayNum.length && !dupFound)
{
if(arrayNum[ctr1] == arrayNum[ctr2])
dupFound = true;
ctr2++;
}
if(dupFound == false)
{
outArray[index] = arrayNum[ctr1];
index++;
}
ctr1++;
}
return outArray;
}
}
public static void testRemoveDuplicates()
{
Scanner input = new Scanner(System.in);
System.out.println("Enter size of input array");
int array[] = new int[input.nextInt()];
System.out.println("Enter number of ints required");
for(int i=0; i<array.length; i++)
{
array[i] = input.nextInt();
}
int outArray[] = new int[array.length];
outArray = removeDuplicates(array);
for(int i=0; i<outArray.length; i++)
{
System.out.println(outArray[i]);
}
}
答案 0 :(得分:3)
下面:
int outArray[] = new int[array.length];
代码假设您的输出数组中有完整的array.length数组元素。这当然是一个太高的数字!关键是:当您创建该大小的 new 数组时,整个数组最初将填充0值。而你的代码只会“覆盖”该输出数组的几个插槽;并且所有其他插槽保持其初始0默认值。
重点是:您首先必须计算您输入数组中有多少重复项;然后你创建一个具有这个数字的新数组。
或者,您可以使用List<Integer>
而不是int [];因为Java集合具有动态增长的能力。 (或者,您可以继续增加该数组以“手动”收集重复项;也可以这样做 - 只需要一些复杂的代码即可实现)。
直接的直接答案是:是的,确切地说 - Java数组是“预先填充的”;见here。
答案 1 :(得分:1)
通过使用标准Java API调用将唯一元素存储在{{1}中,您可以修复所有问题(并且可能会使代码在此过程中大大加快,因为它不再具有二次复杂性)然后将该集合中的值转换回数组。
主要警告是,您需要使用Set
而不是Integer
:
int
Set<Integer> s = new LinkedHashSet<Integer>(Arrays.asList(inputArray));
Integer[] outputArray = s.toArray(new Integer[0]);
会保留插入顺序,因此您可以按原先出现的顺序重新获取元素,但不会重复。
答案 2 :(得分:0)
Java是否用零填充数组?
是的,java会将int array
的每个元素初始化为0.因此使用arr.length
对您不起作用,因为它不会返回数组的逻辑长度。您需要自己跟踪阵列的元素数量。代码中的以下行没有意义
int outArray[] = new int[array.length];
因为outArray开始指向方法removeDuplicates
返回的另一个数组。
我需要通过添加元素从数组中删除重复的元素 在原始数组中没有重复到新数组
您可以做的最简单的方法是:
在方法removeDuplicates
中,
int max = Arrays.stream(arrayNum).max().getAsInt() + 1;
从
修改if
块
if(arrayNum[ctr1] == arrayNum[ctr2])
dupFound = true;
到
if(arrayNum[ctr1] == arrayNum[ctr2]) {
dupFound = true;
arrayNum[ctrl] = max;
max++;
}
答案 3 :(得分:0)
可能是你在这里浪费了太多memory
,考虑最坏的情况,其中给出的所有输入在声明输出数组大小时是不同的。更多Optimized Approach
是您可以拥有可以存储唯一值的List<Integer>
或ArrayList<Integer>
,然后最后,如果您想要Array
中的唯一值,则声明ArraySize
1}}与ArrayList<Integer>
或List<Integer>
大小相同,只需在一个线性循环中,您可以复制所有数据。
Java是否用零填充数组?
是的,每当你声明整数数组时,它的所有元素都是0
。如果您想将Array
的值重置为特定值,可以使用此方法Arrays.fill(int array[] , int default_value).这可以O(list_size)
复杂度完成,这是线性的。
为了您的目的,更好的方法是使用HashSet<Integer>
,它只包含独特的元素,而且Dynamic
本质上是HashSet<Integer>
所以不需要浪费额外的空间,也可以让您的工作变得轻松
首先,您需要Iterator
中的所有元素,然后使用LinkedHashSet<Integer>
,您可以轻松地迭代它,但插入顺序可能会受到干扰。因此,@ Alnitak回复您可以使用HashSet<Integer> set=new HashSet<Integer>();
int total_inputs=sc.nextInt();
for(int i=0;i<total_inputs;i++)
set.add(sc.nextInt());
Iterator itr=set.iterator();
while(itr.hasNext())
System.out.println((int)itr.next());
使插入顺序相同。
使用HashSet的示例代码:
requirements
注意:此处不会保留输入顺序。