Java 从数组中删除重复项的程序不会删除某些项
我编写了以下简短的程序,提示用户构造一个整数数组列表,然后在删除重复项的情况下显示相同的数组。该程序只适用于简单的数字,如1、10甚至100。请注意,排序在这个程序中不是一个问题,因为我只是为自己写的。不过,我确实理解没有对程序进行排序的含义 稍大的数字不能正确地检测为重复。例如,如果我选择构造一个包含2个整数的数组,这两个整数的值都是700,则该方法不会删除重复项。是否还有其他一些我不理解的概念,或者我的代码中有一个我忽略的小错误Java 从数组中删除重复项的程序不会删除某些项,java,arrays,duplicates,Java,Arrays,Duplicates,我编写了以下简短的程序,提示用户构造一个整数数组列表,然后在删除重复项的情况下显示相同的数组。该程序只适用于简单的数字,如1、10甚至100。请注意,排序在这个程序中不是一个问题,因为我只是为自己写的。不过,我确实理解没有对程序进行排序的含义 稍大的数字不能正确地检测为重复。例如,如果我选择构造一个包含2个整数的数组,这两个整数的值都是700,则该方法不会删除重复项。是否还有其他一些我不理解的概念,或者我的代码中有一个我忽略的小错误 import java.util.*; public cla
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);
}
}
}
}
import java.util.*;
公共类重复数组
{
公共静态void main(字符串[]args)
{
//变数
扫描仪扫描=新扫描仪(System.in);
//提示用户并创建一个数组
System.out.print(“\n您的数组将包含多少项:”);
int size=scan.nextInt();
ArrayList编号=新的ArrayList(大小);
//构造数组
对于(int i=0;inumbers.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
方法。压缩功能存在许多潜在问题
主要问题是,您只是比较位置i的数字与位置i-1中的数字。由于您没有事先对数组进行排序,因此无法保证重复数字的位置彼此相邻
解决方案是先对数组排序,然后运行代码。合并或快速排序将使您获得nlog(n)复杂性
或者你可以运行一个嵌套的for循环,根据整个列表检查每个数字是否重复。请记住,这确实会将O的时间复杂度提高到O(n^2)。我会使用
LinkedHashSet
(如果需要保留插入顺序),或者使用常规的哈希集(如果不需要)。我还没有了解到。我的代码中有逻辑错误吗?你的方法只能按原样工作如果你对列表进行排序
。啊,也许我应该澄清一下——如果我只输入两个项目,每个项目都是700,它仍然不能正确地删除重复项。我理解你对排序的意思,但是,如果用户输入700 5 700,在这种情况下它不会删除这些700。但是在我的情况下,它只是700,方法是ill不会删除重复的700s进行编辑以澄清我根据你的建议修改了我的代码,它可以正常工作。你能解释一下为什么这样可以解决问题吗?@AleksandrH刚刚用我的解释更新了我的答案感兴趣!我不知道这一点。只需使用两个项目重新运行程序,127和128 128。它确实运行正常“是这样的。真奇怪!”阿德里安科洛米奇说,“我没必要这么苛刻。如果你真的费心看我的帖子,你会发现我在16小时前就修改了它(而你在15小时前就发布了这篇文章)为了澄清这个顺序对我来说并不重要。@AleksandrH道歉。撤回。只是想表明有一些角落的案例没有包含在最初的代码中。