如何判断对象集合是否含特定属性对象及全量指定符号的Card对象?
问题解答
一、判断集合中是否包含带特定属性的对象
判断集合内对象是否存在符合特定属性的元素,常用两种实现方式:
- 遍历集合,逐个校验对象属性值
- 利用Java 8+的Stream API进行过滤查询
示例代码
遍历校验方式
// 检查集合中是否存在symbol为'a'的Card对象 boolean hasSymbolA = false; for (Card card : cardSet) { if (card.symbol == 'a') { hasSymbolA = true; break; } }
Stream API方式
// 检查是否存在symbol为'a'的Card对象 boolean hasSymbolA = cardSet.stream() .anyMatch(card -> card.symbol == 'a'); // 检查是否包含所有指定symbol的Card对象 char[] requiredSymbols = {'a','b','c','d'}; boolean hasAllSymbols = Arrays.stream(requiredSymbols) .allMatch(symbol -> cardSet.stream() .anyMatch(card -> card.symbol == symbol));
二、修复你的do-while循环代码
你的代码存在两个核心问题:
Card类未重写equals()和hashCode()方法,HashSet无法正确识别对象是否重复CardSet.contains(array)用法错误,contains仅能判断单个对象是否存在,不能直接传入数组
修复后的完整代码
import java.util.HashSet; import java.util.Scanner; import java.util.Set; import java.util.Arrays; public class Experiment2_1 { public class Card { char symbol; int number; // 按symbol重写equals和hashCode,让HashSet能根据symbol判断对象唯一性 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Card card = (Card) o; return symbol == card.symbol; } @Override public int hashCode() { return Character.hashCode(symbol); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); Set<Card> cardSet = new HashSet<>(); char[] requiredSymbols = {'a', 'b', 'c', 'd'}; do { Card card = new Experiment2_1().new Card(); System.out.println("Enter a card Symbol: "); card.symbol = sc.next().charAt(0); System.out.println("Enter card number: "); card.number = sc.nextInt(); cardSet.add(card); // 循环终止条件:所有指定symbol的Card对象都已存在于集合中 } while (!Arrays.stream(requiredSymbols) .allMatch(symbol -> cardSet.stream() .anyMatch(card -> card.symbol == symbol))); System.out.println("All four cards were found"); sc.close(); } }
关键说明
- 重写
equals()和hashCode():HashSet依赖这两个方法判断对象是否重复,若仅关注symbol的唯一性,就按symbol实现;若需同时校验symbol和number,则将两个属性都纳入判断逻辑。 - 循环终止逻辑:通过
Arrays.stream(requiredSymbols).allMatch(...)校验所有指定symbol是否都能在集合中找到对应Card对象,全部满足时终止循环。
内容的提问来源于stack exchange,提问作者Kumar Aniket
相关产品推荐
相关产品推荐

