Kotlin中如何实现无大小写敏感风险的字符串集合操作?
解决不区分大小写的字符串集合处理问题
方案1:自定义封装集合类
自己封装一个集合类,把大小写转换逻辑完全封装在内部,对外暴露的方法自动处理转换,彻底避免外部调用时遗漏转换的风险。以Set为例,实现一个不区分大小写的集合:
import java.util.HashSet; import java.util.Set; public class CaseInsensitiveSet { private final Set<String> internalSet = new HashSet<>(); // 添加元素时自动转小写 public boolean add(String item) { return item == null ? internalSet.add(null) : internalSet.add(item.toLowerCase()); } // 判断包含时自动转小写 public boolean contains(String item) { return item == null ? internalSet.contains(null) : internalSet.contains(item.toLowerCase()); } // 按需实现其他集合方法,比如删除、获取大小等 public boolean remove(String item) { return item == null ? internalSet.remove(null) : internalSet.remove(item.toLowerCase()); } public int size() { return internalSet.size(); } public void clear() { internalSet.clear(); } }
使用时直接调用封装后的方法即可,无需手动处理大小写:
CaseInsensitiveSet set = new CaseInsensitiveSet(); set.add("Hello"); System.out.println(set.contains("hello")); // 输出true
如果需要List类型,同理封装一个CaseInsensitiveList,内部持有ArrayList,在add、contains、indexOf等方法中自动转换大小写。
方案2:使用TreeSet搭配忽略大小写的比较器
Java自带的TreeSet支持通过自定义比较器实现不区分大小写的元素判断,直接使用String.CASE_INSENSITIVE_ORDER作为比较器即可:
import java.util.Set; import java.util.TreeSet; Set<String> caseInsensitiveSet = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); caseInsensitiveSet.add("Banana"); caseInsensitiveSet.contains("banana"); // 返回true caseInsensitiveSet.add("banana"); // 不会重复添加,因为被视为同一元素
注意:TreeSet是有序集合,基于比较器判断元素是否相等,和HashSet的equals判断逻辑不同,且性能略低于HashSet,如果不需要有序性,这个方案不如自定义封装类灵活。
方案3:利用Guava的CaseInsensitiveSet
如果项目中已经引入Guava库,可以直接使用com.google.common.collect.CaseInsensitiveSet,它已经封装好了不区分大小写的集合操作,内部自动处理大小写转换,无需重复造轮子。
内容的提问来源于stack exchange,提问作者Kevin Holtkamp
相关产品推荐
相关产品推荐

