Java - 删除数组列表中的重复项

2022-09-02 11:07:32

我正在开发一个使用 a 来存储的程序。该程序通过菜单提示用户,并允许用户选择要执行的操作。此类操作是将字符串添加到列表,打印条目等。我希望能够做的是创建一个名为.此方法将搜索并删除任何重复的值。我想在列表中保留一个重复值的实例。我还希望此方法返回已删除的重复项总数。ArrayListStringsremoveDuplicates()ArrayList

我一直在尝试使用嵌套循环来实现这一点,但我遇到了麻烦,因为当条目被删除时,索引会被更改,并且事情无法正常工作。从概念上讲,我知道我需要做什么,但我在代码中实现这个想法时遇到了麻烦。ArrayList

下面是一些伪代码:

从第一个条目开始;检查列表中的每个后续条目,看看它是否与第一个条目匹配;删除列表中与第一个条目匹配的每个后续条目;

检查完所有条目后,转到第二个条目;检查列表中的每个条目,看看它是否与第二个条目匹配;删除列表中与第二个条目匹配的每个条目;

对列表中的条目重复

以下是我到目前为止的代码:

public int removeDuplicates()
{
  int duplicates = 0;

  for ( int i = 0; i < strings.size(); i++ )
  {
     for ( int j = 0; j < strings.size(); j++ )
     {
        if ( i == j )
        {
          // i & j refer to same entry so do nothing
        }

        else if ( strings.get( j ).equals( strings.get( i ) ) )
        {
           strings.remove( j );
           duplicates++;
        }
     }
 }

   return duplicates;
}

更新:似乎Will正在寻找一个家庭作业解决方案,该解决方案涉及开发算法以删除重复项,而不是使用Sets的实用解决方案。看看他的评论:

谢谢你的建议。这是作业的一部分,我相信老师打算让解决方案不包括集合。换句话说,我将提出一个解决方案,该解决方案将搜索并删除重复项,而无需实现.老师建议使用嵌套循环,这就是我正在尝试做的事情,但是在某些条目被删除后,我在索引方面遇到了一些问题。HashSetArrayList


答案 1

为什么不使用诸如(以及类似)之类的集合,自然地防止重复?SetHashSet


答案 2

您可以使用嵌套循环而不会出现任何问题:

public static int removeDuplicates(ArrayList<String> strings) {

    int size = strings.size();
    int duplicates = 0;

    // not using a method in the check also speeds up the execution
    // also i must be less that size-1 so that j doesn't
    // throw IndexOutOfBoundsException
    for (int i = 0; i < size - 1; i++) {
        // start from the next item after strings[i]
        // since the ones before are checked
        for (int j = i + 1; j < size; j++) {
            // no need for if ( i == j ) here
            if (!strings.get(j).equals(strings.get(i)))
                continue;
            duplicates++;
            strings.remove(j);
            // decrease j because the array got re-indexed
            j--;
            // decrease the size of the array
            size--;
        } // for j
    } // for i

    return duplicates;

}