Java中获取两个字符串列表公共元素:retainAll方法失效求助
问题原因及解决方案
问题出在字符串的空格不匹配:你用split(",")拆分csv字符串后,得到的元素包含前导空格(比如" Google"),而list1中的元素是无空格的"Google"。retainAll方法依赖equals()判断元素是否相等,带空格和不带空格的字符串显然不相等,所以最终没有保留任何元素。
解决方法就是确保两个列表中的元素内容完全一致,具体有两种常用方式:
方式一:拆分时直接处理空格
使用正则表达式",\\s*"拆分,匹配逗号及后面的任意空白字符,这样拆分出来的元素自动去除前导空格:
String csv = "Apple, Google, Samsung"; // 用正则匹配逗号+任意空白字符,拆分后无多余空格 List<String> csvList = Arrays.asList(csv.split(",\\s*")); ArrayList<String> list0 = new ArrayList<>(csvList); ArrayList<String> list1 = new ArrayList<>(); list1.add("Apple"); list1.add("Asus"); list1.add("Lenovo"); list1.add("Google"); list1.retainAll(list0); // 此时list1结果为["Apple", "Google"]
方式二:拆分后逐个去除空格
如果不想修改拆分规则,可以对拆分后的每个元素调用trim()去除前后空格:
String csv = "Apple, Google, Samsung"; String[] splitArray = csv.split(","); List<String> csvList = new ArrayList<>(); for (String s : splitArray) { csvList.add(s.trim()); } ArrayList<String> list0 = new ArrayList<>(csvList); // 后续代码与原代码一致
如果使用Java 8及以上版本,还可以用流式处理简化:
List<String> csvList = Arrays.stream(csv.split(",")) .map(String::trim) .collect(Collectors.toList());
关键提示
retainAll是通过元素的equals()方法判断是否为公共元素的,所以必须保证两个列表中的元素在内容、大小写、空格等细节上完全一致,否则会被判定为不同元素。
内容的提问来源于stack exchange,提问作者ln3106
相关产品推荐
相关产品推荐

