删除ArrayList的第一个不区分大小写的重复项

时间:2018-12-05 19:52:17

标签: java string arraylist

我有一个包含一些字符串的arraylist:

ArrayList<String> strList = new ArrayList<String>();
strList.addAll(Arrays.asList("interface", "list", "Primitive", "class", "primitive", "List", "Interface", "lIst", "Primitive"));

我写了一种方法来删除arraylist的不区分大小写的字符串:

public static ArrayList<String> removeDuplicates(ArrayList<String> strList) {

    for(int i = 0; i < strList.size(); i++) {
        for(int j = i + 1; j < strList.size(); j++) {
            if(strList.get(i).equalsIgnoreCase(strList.get(j))){
                strList.remove(j);
                j--;
            }
        }
    }
    return strList;   
}

输出:

[interface, list, Primitive, class]

但是,我正在尝试仅删除字符串的第一次出现。我正在尝试使它的输出等于:

[Interface, lIst, Primitive, class]

哪个是阵列列表中重复项的最后一次出现

我要专门做什么:

  

保留的字符串版本与最后一次出现的版本相同。换句话说,   最后一次出现的版本停留在第一次出现的位置

3 个答案:

答案 0 :(得分:1)

我认为从ArrayList中删除并不是一个好主意。最好使用Map创建新列表:

public static List<String> removeDuplicates(List<String> strList) {
    Map<String, String> map = new LinkedHashMap<>();
    strList.forEach(item -> map.put(item.toLowerCase(), item));
    return new ArrayList<>(map.values());
}

输入[interface, list, Primitive, class, primitive, List, Interface, lIst, Primitive]

输出: [Interface, lIst, Primitive, class]

PS

与一行Stream相同,但不太清楚:

public static List<String> removeDuplicates(List<String> strList) {
    return new ArrayList<>(strList.stream().collect(Collectors.toMap(String::toLowerCase, str -> str, (prev, next) -> next, LinkedHashMap::new)).values());
}

答案 1 :(得分:0)

现在,它会保留第一个匹配项,因此,如果要保留最后一个匹配项,您可以反向浏览列表:

for(int i = strList.size() - 1; i >= 0; i--) {
    for(int j = i - 1; j >= 0; j--) {
    ...

答案 2 :(得分:0)

使用流,您可以这样做:

public static Set<String> removeFormerDuplicates(List<String> strList) {
    return new HashSet<>(strList.stream()
            .collect(Collectors.toMap(String::toLowerCase, Function.identity()))
            .values());
}

或者如果您正在寻找列表作为输出

public static List<String> removeFormerDuplicates(List<String> strList) {
    return new ArrayList<>(strList.stream()
            .collect(Collectors.toMap(String::toLowerCase, Function.identity()))
            .values());
}