将已排序的ArrayList中的重复项分组到另一个ArrayList中

时间:2014-07-24 13:11:31

标签: java arraylist

(完全披露:这是一些我似乎无法弄清楚的功课。)

任务:识别列表中的重复项,并将它们添加到另一个要打印的ArrayList中。

规格:我不允许使用除ArrayList之外的任何集合,因此我无法使用类似Set的集合。似乎StackOverflow上的每个答案都建议使用Set,这就是我决定提出这个问题的原因。

到目前为止我尝试过的事情:

public static void deleteDuplicates(List<String> list)
{
    int pointer = 1;
    List<String> duplicates = new ArrayList<String>();
    for (int i = 0; i < list.size() - 1; i++) {
        if (list.get(i).equals(list.get(pointer))) {
            duplicates.add(list.get(i));

            if (pointer == 1) {
                duplicates.add(list.get(pointer));
            } else if ((pointer + 1) == list.size() - 1) {
                duplicates.add(list.get(pointer));
            }

            pointer++;
        } else {
            display(duplicates);
            duplicates = new ArrayList<String>();
            pointer++;
        }
    }
}

测试数据

List<String> duplicated = new ArrayList<String>();
    duplicated.add("3");
    duplicated.add("3");
    duplicated.add("30");
    duplicated.add("46");
    duplicated.add("46");

什么不起作用:当列表的大小是奇数时,重复报告正确。当列表的大小为偶数时,仅报告前两个重复项。

3 个答案:

答案 0 :(得分:2)

你的方法的问题是在对最后一个元素执行if-else检查之前循环退出。在最后一次迭代中,if条件满足并且它添加到重复项但它不会再次进入for循环以转到else部分。所以它没有得到显示。尝试

public static void deleteDuplicates(List<String> list)
{
    int pointer = 1;
    List<String> duplicates = new ArrayList<String>();
    for (int i = 0; i < list.size() - 1; i++) {
        if (list.get(i).equals(list.get(pointer))) {
            duplicates.add(list.get(i));

            if (pointer == 1) {
                duplicates.add(list.get(pointer));
            } else if ((pointer + 1) == list.size() - 1) {
                duplicates.add(list.get(pointer));
            }

            pointer++;
        } else if(duplicates.size() > 0) {
            display(duplicates);
            duplicates.clear();
            pointer++;
        }
    }
    if(duplicates.size() > 0){
        display(duplicates);
    }
}

答案 1 :(得分:0)

虽然Syam S的回答是正确的,但这也适用于未排序的数组:

public static void deleteDuplicates(List<String> list)
{
    List<String> duplicates = new ArrayList<String>();
    for (int j = 0; j < list.size() - 2; j++) {
        int pointer = j;
        for (int i = j+1; i < list.size() - 1; i++) {
            if (list.get(i).equals(list.get(j))) {
                duplicates.add(list.get(i));
                duplicates.add(list.get(j));
            } 
            if(duplicates.size() > 0){
                System.out.println(duplicates);
                duplicates.clear();
            }
        }
    }
}

您可以在Ideone

中查看工作版本

答案 2 :(得分:0)

试试这个:

扩展ArrayList

1)

boolean result  =   false;
            if(!contains(object))
                result= super.add(object);
            return result;

OR

2)

ArrayList<String> myList    =   new ArrayList<String>()
    {
        @Override
        public boolean add(String object)
        {
            boolean present =   false;
            boolean result  =   false;
            for(int i=0;i<size();i++)
            {
                if(object.equals(get(i)))
                {
                    present =   true;
                    break;
                }
            }
            if(!present)
                result= super.add(object);
            return result;
        }


    };


    myList.add("1");
    myList.add("2");
    myList.add("3");
    myList.add("1");
    myList.add("2");
    myList.add("3");
    myList.add("1");
    myList.add("1");
    System.out.println(myList);