基于填充的属性的对象组列表

时间:2019-06-17 22:30:59

标签: java collections

我有一个具有10个属性的类。我想根据是否填充的属性对此类对象的列表进行分组。恰好我会得到2 ^ n个小组。我可以迭代该列表并编写2 ^ n个条件,并将它们分组为新列表。还有其他更好的方法来实现此功能,而不是编写那些切换条件吗?

3 个答案:

答案 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 constructorssetter方法。

现在,当您想分成几组时,可以使用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))