Java中使用ArrayList的contains方法结合equalsIgnoreCase实现忽略大小写元素检查的问题
解决ArrayList.contains()区分大小写的问题
嘿,我明白你遇到的困扰了——你想忽略大小写检查新增的产品编码是否已存在,但ArrayList.contains()默认是严格区分大小写的,而且你代码里的code.equalsIgnoreCase(code)这行其实完全没用(毕竟自己和自己比肯定返回true,还没把结果存下来)。咱们来把这个问题搞定:
问题根源
ArrayList.contains()方法底层是调用元素的equals()方法来判断匹配的,而String.equals()是区分大小写的,所以直接用productcode.contains(code)只会找到完全大小写一致的编码,达不到你想要的忽略大小写的效果。
解决方案1:手动遍历列表检查(兼容所有Java版本)
咱们可以自己遍历productcode列表,逐个用equalsIgnoreCase()来比较,这样就能忽略大小写了:
static void AddProductCode() { boolean print = true; for (int i = 0; i < product.size(); i++) { System.out.println(productcode.get(i)+" " +product.get(i)+" "+ productprice.get(i)); } System.out.print("PRODUCT CODE : "); code = scan.next(); // 手动检查是否存在忽略大小写的匹配 boolean check = false; for (String existingCode : productcode) { if (existingCode.equalsIgnoreCase(code)) { check = true; break; // 找到匹配就提前退出循环 } } if(check){ System.out.println("CODE IS UNAVAILABLE"); AddProductCode(); } else { AddProduct2nd(); } }
解决方案2:用Java Stream简化代码(Java 8及以上)
如果你的项目用的是Java 8或更高版本,可以用Stream的anyMatch()方法来简化遍历逻辑,代码更简洁:
// 把上面的手动遍历替换成这一行 boolean check = productcode.stream() .anyMatch(existingCode -> existingCode.equalsIgnoreCase(code));
额外优化建议(高频查询场景)
如果这个编码检查操作很频繁,或者productcode列表会变得很大,遍历列表的效率会比较低。这时候可以改用不区分大小写的Set来存储编码,比如TreeSet:
// 初始化的时候用这个Set代替ArrayList Set<String> productCodeSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
之后检查编码是否存在直接调用productCodeSet.contains(code)就可以了,它会自动忽略大小写,而且查询效率是O(log n),比遍历ArrayList的O(n)快很多。
最后别忘了删掉你代码里那行无用的code.equalsIgnoreCase(code);,它完全起不到任何作用~
内容的提问来源于stack exchange,提问作者Kurt Bernstein Blancia
相关产品推荐
相关产品推荐

