Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据填充的属性对对象列表进行分组_Java_Collections - Fatal编程技术网

Java 根据填充的属性对对象列表进行分组

Java 根据填充的属性对对象列表进行分组,java,collections,Java,Collections,我有一个有10个属性的类。我想根据是否填充属性对该类的对象列表进行分组。确切地说,我将得到2^n个组。我可以迭代列表并写入2^n个条件,然后将它们分组到新列表中。有没有其他更好的方法来实现此功能,而不是编写这些切换条件?您可以避免编写多个switch语句,并且在类本身中有一个标识符/键,这有助于了解是否设置了某些属性 例如: DemoClass(3个属性用于简化) 可以通过各种方式填充上述字段,例如重载构造函数或setter方法 现在,当您想要分成多个组时,您可以使用HashMap并根据其键的值

我有一个有10个属性的类。我想根据是否填充属性对该类的对象列表进行分组。确切地说,我将得到2^n个组。我可以迭代列表并写入2^n个条件,然后将它们分组到新列表中。有没有其他更好的方法来实现此功能,而不是编写这些切换条件?

您可以避免编写多个
switch
语句,并且在类本身中有一个标识符/键,这有助于了解是否设置了某些属性

例如:

DemoClass(3个属性用于简化)

可以通过各种方式填充上述字段,例如
重载构造函数
setter
方法

现在,当您想要分成多个组时,您可以使用HashMap并根据其键的值将类的对象添加到列表中,如下所示

Map<String, List<DemoClass>> map = new HashMap<>();
for (DemoClass demoClass : demoClasses) {
    map.computeIfAbsent(demoClass.getKey(), k -> new ArrayList<>()).add(demoClass);
}
Map Map=newhashmap();
用于(DemoClass DemoClass:DemoClass){
map.computeIfAbsent(demoClass.getKey(),k->new ArrayList()).add(demoClass);
}

您可以避免编写多个
switch
语句,并且在类本身中有一个标识符/键,这有助于理解是否设置了某些属性

例如:

DemoClass(3个属性用于简化)

可以通过各种方式填充上述字段,例如
重载构造函数
setter
方法

现在,当您想要分成多个组时,您可以使用HashMap并根据其键的值将类的对象添加到列表中,如下所示

Map<String, List<DemoClass>> map = new HashMap<>();
for (DemoClass demoClass : demoClasses) {
    map.computeIfAbsent(demoClass.getKey(), k -> new ArrayList<>()).add(demoClass);
}
Map Map=newhashmap();
用于(DemoClass DemoClass:DemoClass){
map.computeIfAbsent(demoClass.getKey(),k->new ArrayList()).add(demoClass);
}

我最终得到了字符串中记录属性的一个位值(每个属性的1和0(1表示值存在,0表示它不存在))并按字符串进行分组

records.stream().map(record -> new ExportDto.Builder().buildUpon(record).bitValue(getBitValueOfExportRecord(record)).build())
.collect(Collectors.groupingBy(ExportDto::getBitValue))

最后,我得到了字符串中记录属性的一个位值(每个属性的1和0(1表示值存在,0表示它不存在))并按字符串对它们进行分组

records.stream().map(record -> new ExportDto.Builder().buildUpon(record).bitValue(getBitValueOfExportRecord(record)).build())
.collect(Collectors.groupingBy(ExportDto::getBitValue))

十个二进制值不会导致1024个排列吗?您可以将其收集为位(每个字段都有自己的位),可以直接用作分组索引。十个二进制值不会导致1024个排列吗?您可以将其收集为位(每个字段都有自己的位),这可以直接用作分组索引。这主意不错,但我认为您需要将每个
demoClass
添加到值中:
map.put(demoClass.getKey(),demoClass.getOrDefault(demoClass.getKey(),new ArrayList())
。还有,为什么不使用a作为键呢。我们不能使用
demoClass
,因为它是
demoClass
的一个实例,而不是
HashMap
的一个实例。另外
computeIfAbsent
是Java提供的一个很好的API,与使用
getOrDefault
相比,它使代码更容易理解,这是非常有用的如果值不是
集合
也可以使用
位集
,但我觉得上面的解决方案是使用一个字符串键,它提供关于集合属性的信息,可读性更高,并且可以进一步扩展到诸如找出填充了哪些属性的用例。这主意不错,但我认为不是
computeIfAb已发送
,您需要将每个
demoClass
添加到值:
map.put(demoClass.getKey(),demoClass.getOrDefault(demoClass.getKey(),new ArrayList())
。还有,为什么不使用a作为键呢。我们不能使用
demoClass
,因为它是
demoClass
的一个实例,而不是
HashMap
的一个实例。另外
computeIfAbsent
是Java提供的一个很好的API,与使用
getOrDefault
相比,它使代码更容易理解,这是非常有用的如果值不是
集合
也可以使用
位集
,但我觉得上面的解决方案是使用一个字符串键来提供关于集合属性的信息,它更具可读性,并且可以进一步扩展到用例中,例如找出填充了哪些属性。