You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何统计对象中非空属性的数量?以Card对象为例

嘿,我来给你几个实用的方案,不用依赖函数列表就能搞定这个统计需求:

方案一:实时维护计数器(高效型)

这个思路是在Card类里专门维护一个计数器,每次调用setter方法时,根据字段的空值状态变化来更新计数。这样每次要获取统计结果时,直接返回计数器的值就行,不用反复遍历字段,效率很高。

以Java为例,代码实现如下:

public class Card {
    private String name;
    private String id;
    private String date;
    private String number;
    // 用于统计非空字段数量的计数器
    private int nonNullFieldCount = 0;

    public void setName(String name) {
        boolean wasNull = this.name == null;
        this.name = name;
        boolean isNowNull = this.name == null;
        // 根据字段空值状态的变化更新计数器
        updateCount(wasNull, isNowNull);
    }

    // 同理实现setId、setDate、setNumber方法
    public void setId(String id) {
        boolean wasNull = this.id == null;
        this.id = id;
        boolean isNowNull = this.id == null;
        updateCount(wasNull, isNowNull);
    }

    public void setDate(String date) {
        boolean wasNull = this.date == null;
        this.date = date;
        boolean isNowNull = this.date == null;
        updateCount(wasNull, isNowNull);
    }

    public void setNumber(String number) {
        boolean wasNull = this.number == null;
        this.number = number;
        boolean isNowNull = this.number == null;
        updateCount(wasNull, isNowNull);
    }

    private void updateCount(boolean wasNull, boolean isNowNull) {
        // 从空变为非空,计数+1
        if (wasNull && !isNowNull) {
            nonNullFieldCount++;
        }
        // 从非空变为空,计数-1
        else if (!wasNull && isNowNull) {
            nonNullFieldCount--;
        }
        // 其他情况(状态无变化)不修改计数
    }

    // 获取非空字段数量
    public int getNonNullFieldCount() {
        return nonNullFieldCount;
    }
}

使用时,比如执行card.setName("abc");后,调用card.getNonNullFieldCount()就会返回1,完全符合你的需求。

方案二:直接检查字段(简洁型)

如果你的Card类字段数量不多(比如只有这4个),直接在统计方法里逐个检查字段是否非空是最简洁的方式,不用额外维护计数器,代码也更容易理解。

还是以Java为例:

public class Card {
    private String name;
    private String id;
    private String date;
    private String number;

    // 正常实现setter方法
    public void setName(String name) { this.name = name; }
    public void setId(String id) { this.id = id; }
    public void setDate(String date) { this.date = date; }
    public void setNumber(String number) { this.number = number; }

    // 统计非空字段数量
    public int getNonNullFieldCount() {
        int count = 0;
        if (name != null) count++;
        if (id != null) count++;
        if (date != null) count++;
        if (number != null) count++;
        return count;
    }
}

这个方案里,每次调用getNonNullFieldCount()时,会逐个判断每个字段是否不为null,累加计数。执行card.setName("abc");后,统计结果同样是1。

如果用的是Python,思路完全一致,代码示例如下:

class Card:
    def __init__(self):
        self.name = None
        self.id = None
        self.date = None
        self.number = None

    def set_name(self, name):
        self.name = name

    def set_id(self, id):
        self.id = id

    def set_date(self, date):
        self.date = date

    def set_number(self, number):
        self.number = number

    def get_non_null_field_count(self):
        count = 0
        if self.name is not None:
            count += 1
        if self.id is not None:
            count += 1
        if self.date is not None:
            count += 1
        if self.number is not None:
            count += 1
        return count

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

火山引擎 最新活动