从数组中删除重复条目的程序不会删除某些条目

时间:2016-09-26 00:52:08

标签: java arrays duplicates

我编写了以下简短程序,提示用户构造一个整数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);
            }
        }   
    }   

}

2 个答案:

答案 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)。