如何使用两种方法从数组列表中删除重复项?

时间:2014-03-27 18:14:14

标签: java

第一种方法找到副本,第二种方法删除它。 我尝试了以下代码,但它不起作用。我不明白为什么。要用两种方法完成。当我调用方法时,它们不会删除重复项。 arraylist没有变化。我想使用两种方法删除重复项。

public static int find(ArrayList<String> s, int i) {

    for (int j = i + 1; j < s.size(); j = j + 1) {
        if (s.get(i) == s.get(j)) {
            return j;
        }
    }

    return -1;
}


public static void removeDuplicates(ArrayList<String> s) {
    for (int i = 0; i < s.size(); i = i + 1) {
        int foundAt = (find(s, i));
        if (foundAt >= 0) {
            s.remove(i);
        }
    }
}

5 个答案:

答案 0 :(得分:1)

不要被打扰:

public static List<String> removeDups(final List<String> orig)
{
    return new ArrayList<>(new LinkedHashSet<>(orig));
}

(注意使用LinkedHashSet,我们希望保留元素迭代排序)

答案 1 :(得分:0)

为什么不直接将其转储到Set

List<String> listduplicates =  new ArrayList<String>(10);
//add elements to the list
Set<String> as = new HashSet<String>(listduplicates );

List<String> listunique =  new ArrayList<String>(as.size());

listunique现在提供了独特的元素

答案 2 :(得分:0)

如果您想使用两种方法,并遵循相同的想法,您可以修复您的方法:

   public static int find(List<String> s, int j) {
        for(int i=j;i<s.size();i++) {
            if (s.lastIndexOf(s.get(i)) != i)  {
                return i;
            }
        }
        return -1;
    }


    public static void removeDuplicates(ArrayList<String> s) {
        for (int j=0; j<s.size();j++) {
            int i = -1;
            while((i=find(s,j))>=0) {
                s.remove(i);
            }
        }
    }

答案 3 :(得分:0)

如果您使用的是Java 8,则可以使用带有distinct()操作的Stream API来消除重复项:

List<Integer> list = Arrays.asList(5, 3, 6, 5, 4, 6);
List<Integer> filtered = list.stream().distinct().collect(Collectors.toList());
System.out.println("filtered: " + filtered); // [5, 3, 6, 4]

答案 4 :(得分:0)

我检查了你的代码,它运行正常并从列表中删除重复项。您可以更改removeDuplicates方法以删除列表中稍后的重复项。

 public static void removeDuplicates(ArrayList<String> s) {
            for (int i = 0; i < s.size(); i = i + 1) {
                int foundAt = (find(s, i));
                if (foundAt >= 0) {
                    s.remove(foundAt);
                }
            }
        }