我有一个具有10个属性的类。我想根据是否填充的属性对此类对象的列表进行分组。恰好我会得到2 ^ n个小组。我可以迭代该列表并编写2 ^ n个条件,并将它们分组为新列表。还有其他更好的方法来实现此功能,而不是编写那些切换条件吗?
答案 0 :(得分:0)
您可以避免编写多个switch
语句,并且在类本身中具有标识符/键,这有助于理解是否设置了某些属性。
示例:
DemoClass (为简化起见,提供了3个属性)
public class DemoClass {
public String property1 = null;
public String property2 = null;
public String property3 = null;
public String getKey() {
StringBuilder sb = new StringBuilder();
sb.append(this.property1 != null ? "PROPERTY1" : "").append("|");
sb.append(this.property2 != null ? "PROPERTY2" : "").append("|");
sb.append(this.property3 != null ? "PROPERTY3" : "").append("|");
return sb.toString();
}
}
以上字段可以通过各种方式填充,例如overloaded constructors
或setter
方法。
现在,当您想分成几组时,可以使用HashMap并根据其键的值将类的对象添加到列表中,如下所示:
Map<String, List<DemoClass>> map = new HashMap<>();
for (DemoClass demoClass : demoClasses) {
map.computeIfAbsent(demoClass.getKey(), k -> new ArrayList<>()).add(demoClass);
}
答案 1 :(得分:0)
您可以在感兴趣的类中添加一个方法,该方法根据是否初始化了相应的字段来返回设置了每个位的BitSet
:
public class DemoClass {
public BitSet getInitializationStatus() { ... }
然后,您可以简单地将这些位集用作从位集到列表的映射中的键:
public HashMap<BitSet, List<DemoClass>> buildGroups(List<DemoClass> demoClasses)
{
HashMap<BitSet, List<DemoClass>> groups = new HashMap<>();
for( DemoClass demoClass : demoClasses )
{
List<DemoClass> group = groups.getOrDefault(demoClass.getInitializationStatus(),
new ArrayList<>());
group.add(demoClass);
groups.put(demoClass.getInitializationStatus(), group);
}
return groups;
}
答案 2 :(得分:0)
我最终得到了一个字符串的Record属性的位值(每个属性为1和0(每个1表示存在值,0表示不存在)),然后按String对其进行分组。
records.stream().map(record -> new ExportDto.Builder().buildUpon(record).bitValue(getBitValueOfExportRecord(record)).build())
.collect(Collectors.groupingBy(ExportDto::getBitValue))