You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断对象集合是否含特定属性对象及全量指定符号的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循环代码

你的代码存在两个核心问题:

  1. Card类未重写equals()和hashCode()方法,HashSet无法正确识别对象是否重复
  2. 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();
    }
}

关键说明

  1. 重写equals()和hashCode():HashSet依赖这两个方法判断对象是否重复,若仅关注symbol的唯一性,就按symbol实现;若需同时校验symbol和number,则将两个属性都纳入判断逻辑。
  2. 循环终止逻辑:通过Arrays.stream(requiredSymbols).allMatch(...)校验所有指定symbol是否都能在集合中找到对应Card对象,全部满足时终止循环。

内容的提问来源于stack exchange,提问作者Kumar Aniket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:35:25