Java TreeSet判断是否包含另一集合任意元素及ClassCastException问题
判断两个TreeSet是否存在共同元素的正确实现
你遇到的ClassCastException是因为TreeSet.contains(Object o)方法只接受单个元素作为参数,而你传入了另一个TreeSet对象。TreeSet内部会尝试把这个传入的TreeSet和它自身存储的String元素做比较,这显然是类型不兼容的,所以抛出了类型转换异常。
下面给你几种正确的实现方式,都能达到"只要两个集合有任一共同元素就返回true"的需求:
方式一:遍历集合逐个检查
这是最直观的方式,遍历其中一个集合的元素,逐个调用contains方法检查是否存在于另一个集合中,找到第一个匹配项就立即返回true,避免不必要的遍历:
class TreeSetExample{ public static void main(String[] args){ TreeSet<String> set1 = new TreeSet<>(); TreeSet<String> set2 = new TreeSet<>(); set1.add("a"); set1.add("b"); set1.add("d"); set1.add("e"); set2.add("c"); set2.add("b"); set2.add("d"); set2.add("g"); boolean hasCommonElement = false; // 遍历set2,检查每个元素是否在set1中 for (String element : set2) { if (set1.contains(element)) { hasCommonElement = true; break; // 找到一个就停止遍历 } } System.out.println(hasCommonElement); // 输出true } }
方式二:使用Java 8+ Stream API(更简洁)
利用Stream的anyMatch方法,一行代码就能实现逻辑,可读性也很强:
class TreeSetExample{ public static void main(String[] args){ TreeSet<String> set1 = new TreeSet<>(); TreeSet<String> set2 = new TreeSet<>(); set1.add("a"); set1.add("b"); set1.add("d"); set1.add("e"); set2.add("c"); set2.add("b"); set2.add("d"); set2.add("g"); boolean hasCommonElement = set2.stream().anyMatch(set1::contains); System.out.println(hasCommonElement); // 输出true } }
方式三:利用集合交集判断(注意避免修改原集合)
如果你想通过交集的方式判断,不要直接调用set1.retainAll(set2)(这会修改set1,移除所有不在set2中的元素),可以先创建一个临时集合来计算交集:
class TreeSetExample{ public static void main(String[] args){ TreeSet<String> set1 = new TreeSet<>(); TreeSet<String> set2 = new TreeSet<>(); set1.add("a"); set1.add("b"); set1.add("d"); set1.add("e"); set2.add("c"); set2.add("b"); set2.add("d"); set2.add("g"); // 创建set1的副本,避免修改原集合 TreeSet<String> tempSet = new TreeSet<>(set1); tempSet.retainAll(set2); // 计算交集,tempSet现在只包含共同元素 boolean hasCommonElement = !tempSet.isEmpty(); System.out.println(hasCommonElement); // 输出true } }
小提示
优先选择方式一或方式二,因为它们在找到第一个共同元素后就会停止遍历,性能更好;方式三更适合需要获取所有共同元素的场景,如果只是判断存在性,前两种更高效。
内容的提问来源于stack exchange,提问作者Akshay Uttur
相关产品推荐
相关产品推荐

