删除Java中的List中的重复字符串

use*_*196 3 java collections set

更新:我猜HashSet.add(Object obj)不会打电话contains.有没有办法实现我想要的东西(删除重复字符串忽略大小写使用Set)?

原始问题:尝试从java中的String列表中删除重复,但是在下面的代码CaseInsensitiveSet.contains(Object ob)中没有被调用,为什么?

public static List<String> removeDupList(List<String>list, boolean ignoreCase){
    Set<String> set = (ignoreCase?new CaseInsensitiveSet():new LinkedHashSet<String>());
    set.addAll(list);

    List<String> res = new Vector<String>(set);
    return res;
}


public class CaseInsensitiveSet  extends LinkedHashSet<String>{

    @Override
    public boolean contains(Object obj){
        //this not getting called.
        if(obj instanceof String){

            return super.contains(((String)obj).toLowerCase());
        }
        return super.contains(obj);
    }

}
Run Code Online (Sandbox Code Playgroud)

Evg*_*eev 7

尝试

        Set set = new TreeSet(String.CASE_INSENSITIVE_ORDER);
        set.addAll(list);
        return new ArrayList(set);
Run Code Online (Sandbox Code Playgroud)

更新,但汤姆安德森提到它不保留初始订单,如果这真的是一个问题尝试

    Set<String> set = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
    Iterator<String> i = list.iterator();
    while (i.hasNext()) {
        String s = i.next();
        if (set.contains(s)) {
            i.remove();
        }
        else {
            set.add(s);
        }
    }
Run Code Online (Sandbox Code Playgroud)

版画

[2, 1]
Run Code Online (Sandbox Code Playgroud)


Pet*_*rey 5

contains 没有被调用,因为LinkedHashSet没有这样实现.

如果你想要add()来调用contains(),你也需要覆盖它.

它没有以这种方式实现的原因是首先调用包含意味着你正在执行两次查找而不是一次更慢的查找.