Java中嵌套List调用contains判断指定字符串返回false,求问题原因
问题原因分析
你遇到的问题核心是混淆了嵌套列表的层次结构:
你的list是List<List<String>>类型——简单说就是一个"列表的列表",外层列表里的每个元素都是一个完整的List<String>(比如第一个元素是所有非洲国家名称的列表,第二个是面积的字符串列表)。
当你调用list.contains("Nigeria")时,Java会遍历外层列表的每个元素(也就是那些内层的List<String>对象),检查是否有任何一个内层列表完全等于字符串"Nigeria"——这显然不可能,因为类型都不匹配,所以结果必然是false。
解决方案
根据你的需求,这里有几种更合理的实现方式:
1. 直接从原始的africaList搜索(最推荐)
既然你已经有了封装好的Africa对象列表,直接遍历这些对象判断名称即可,不需要额外构建嵌套列表:
// 用Stream简化写法 boolean hasNigeria = africaList.stream() .anyMatch(country -> "Nigeria".equals(country.getName())); // 或者用传统for循环 boolean hasNigeria = false; for (Africa country : africaList) { if ("Nigeria".equals(country.getName())) { hasNigeria = true; break; } }
2. 利用你已构建的嵌套列表搜索
如果你一定要用现有的list,需要定位到存储国家名称的内层列表(也就是list.get(0)),再调用它的contains方法:
// list.get(0)是所有国家名称组成的列表 boolean hasNigeria = list.get(0).contains("Nigeria");
3. 优化搜索效率(适合频繁查询的场景)
如果需要多次执行国家名称搜索,建议把名称存入Set,因为Set的contains操作时间复杂度是O(1),比List的O(n)快很多:
import java.util.stream.Collectors; // 一次性把所有国家名称提取到Set里 Set<String> africanCountryNames = africaList.stream() .map(Africa::getName) .collect(Collectors.toSet()); // 后续查询直接用Set的contains boolean hasNigeria = africanCountryNames.contains("Nigeria");
额外优化:简化嵌套列表的构建
你原来的嵌套列表构建代码可以用Java Stream简化,可读性更高:
import java.util.stream.Collectors; List<String> countryNames = africaList.stream() .map(Africa::getName) .collect(Collectors.toList()); List<String> countrySurfaces = africaList.stream() .map(country -> String.valueOf(country.getSurface())) .collect(Collectors.toList()); // 直接组装成嵌套列表 List<List<String>> list = Arrays.asList(countryNames, countrySurfaces);
内容的提问来源于stack exchange,提问作者theadvocate
相关产品推荐
相关产品推荐

