我编写了以下简短程序,提示用户构造一个整数ArrayList,然后显示删除了重复项的同一个数组。该程序可以正常使用简单的数字,例如1,10或甚至100。请注意,排序不是本程序中的一个问题,因为我只为自己编写。但我确实理解没有对程序进行排序的含义。
稍微大一些的数字未被正确检测为重复数据。例如,如果我选择构造一个包含2个整数的数组,两个值都为700,则该方法不会删除重复项。还有其他一些我不理解的概念,或者我的代码中的一个小错误,我忽略了吗?
import java.util.*;
public class DuplicateArray
{
public static void main( String [] args )
{
// Variables
Scanner scan = new Scanner(System.in);
// Prompt user and create an array
System.out.print("\nHow many items will your array contain: ");
int size = scan.nextInt();
ArrayList<Integer> numbers = new ArrayList<Integer>(size);
// Construct the array
for( int i = 0; i < size; i++ )
{
System.out.print("Item #" + (i+1) + ": ");
numbers.add( scan.nextInt() );
}
// Remove duplicates
compress( numbers );
// Print compressed array
System.out.println("\nBelow is that same array with duplicates removed.");
for( int i = 0; i <= numbers.size()-1; i++ )
{
System.out.print( numbers.get(i) + " " );
}
}
/*
* Removes duplicates from the input array
*/
public static void compress( ArrayList<Integer> numbers )
{
// If the array is of size 1, then there are no duplicates to check for */
if( numbers.size() <= 1 )
{
return;
}
// Traverse the array backwards */
for( int i = numbers.size() - 1; i > 0; i-- )
{
if( numbers.get(i) == numbers.get(i-1) )
{
numbers.remove(i);
}
}
}
}
答案 0 :(得分:1)
用于比较不是这个
numbers.get(i) == numbers.get(i-1)
但numbers.get(i).equals(numbers.get(i-1))
方法。
出现这种奇怪行为的原因是内部JVM具有来自-128..127的Integer
值的缓存(请参阅Integer#valueOf
方法实现)。因此numbers.get(i) == numbers.get(i-1)
仅适用于此数字范围。但是对于不在范围内的数字,这样的比较操作不起作用,您必须使用equals
方法。
答案 1 :(得分:0)
你的压缩功能有很多潜在的问题。
主要问题是您只是将位置i的数字与位置i-1的数字进行比较。由于您未提前对数组进行排序,因此无法保证重复数字的位置将彼此相邻。
解决方案是首先对数组进行排序然后运行代码。合并或快速排序将使您获得nlog(n)复杂性。
或者您可以运行嵌套的for循环,它会针对整个列表检查每个数字以查找重复项。请记住,这确实会将O时间复杂度提高到O(n ^ 2)。