如何统计对象中非空属性的数量?以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




