use*_*958 6 java string arraylist
我有一个包含一些字符串的数组列表:
ArrayList<String> strList = new ArrayList<String>();
strList.addAll(Arrays.asList("interface", "list", "Primitive", "class", "primitive", "List", "Interface", "lIst", "Primitive"));
Run Code Online (Sandbox Code Playgroud)
我写了一个方法来删除数组列表中不区分大小写的字符串:
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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
[interface, list, Primitive, class]
Run Code Online (Sandbox Code Playgroud)
但是,我试图仅删除第一次出现的字符串。我正在尝试使其输出等于:
[Interface, lIst, Primitive, class]
Run Code Online (Sandbox Code Playgroud)
这将是数组列表中重复项的最后一次出现
我具体想做什么:
保留的字符串版本与最后一次出现的版本相同。换句话说,最后一次出现的版本保留在第一次出现的位置
我认为从 中删除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());
}
Run Code Online (Sandbox Code Playgroud)
输入: [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());
}
Run Code Online (Sandbox Code Playgroud)