Java 从数组中删除重复项的程序不会删除某些项

Java 从数组中删除重复项的程序不会删除某些项,java,arrays,duplicates,Java,Arrays,Duplicates,我编写了以下简短的程序,提示用户构造一个整数数组列表,然后在删除重复项的情况下显示相同的数组。该程序只适用于简单的数字,如1、10甚至100。请注意,排序在这个程序中不是一个问题,因为我只是为自己写的。不过,我确实理解没有对程序进行排序的含义 稍大的数字不能正确地检测为重复。例如,如果我选择构造一个包含2个整数的数组,这两个整数的值都是700,则该方法不会删除重复项。是否还有其他一些我不理解的概念,或者我的代码中有一个我忽略的小错误 import java.util.*; public cla

我编写了以下简短的程序,提示用户构造一个整数数组列表,然后在删除重复项的情况下显示相同的数组。该程序只适用于简单的数字,如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);
            }
        }   
    }   

}
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道歉。撤回。只是想表明有一些角落的案例没有包含在最初的代码中。