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

6

我有一个包含字符串的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]

这是关于ArrayList中重复元素的最后出现位置的问题。

具体来说,我想要做的是:

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

2个回答

4

我认为从 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] 附注: 与单行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());
}

0

现在它只保留第一次出现,如果你想保留最后一次出现,只需倒序遍历列表:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接