java通过排除元素将一个列表拆分为多个列表
有一个列表,其中元素根据特定条件相互排斥java通过排除元素将一个列表拆分为多个列表,java,algorithm,collections,Java,Algorithm,Collections,有一个列表,其中元素根据特定条件相互排斥 现在我需要根据这个互斥条件将其拆分为多个列表 分区后,互斥元素不能出现在子列表中 分段后的子列表数量应最小化 -------------比如说---------------------- 原始清单[A、B、C] A和C是互斥的,A和B不是互斥的,B和C不是互斥的 它可以分为[A]、[B,C]或[C]、[A,B] 不要拆分为[A]、[B]、[C],因为拆分后的子列表总数不是最小值 谁能帮我?据我所知,您希望根据集合中任意两个元素之间的任意比较
谁能帮我?据我所知,您希望根据集合中任意两个元素之间的任意比较来划分集合元素。我认为java没有现成的功能。一种方法是:
公共类分区{
公共列表分区(列表、双预测分区条件){
列表分区=新的ArrayList();
而(!list.isEmpty()){
//从原始列表中的剩余元素中获取第一个元素
T firstElement=list.remove(0);
//将第一个元素添加到子集中
//此子集上的所有元素不得与firstElement互斥
Set subset=新的HashSet();
添加(第一个元素);
//获取可以驻留在同一子集中的所有剩余元素
//第一要素
List notMutuallyExclusive=List.stream().filter(e->!partitioncondition.test(firstElement,e))
.collect(Collectors.toList());
//将它们添加到firstElement的子集
subset.addAll(不相互排斥);
//将子集添加到分区(子集列表)
添加(子集);
//从原始列表中删除添加的元素
列表。移除所有(不相互排斥);
}
返回分区;
}
}
您可以像这样测试您的场景:
公共类分区SmallTest{
私人双信用卡相互排斥(){
返回(左,右)->(“A.equals(左)&&“C.equals(右))|(“C.equals(左)&“A.equals(右));
}
@试验
公开无效测试(){
List List=newarraylist(Arrays.asList(“A”、“B”、“C”);
所需列表=新的ArrayList();
预期。增加(一套(“A”、“B”));
预期。增加(一套(“C”);
List actual=new Partition().Partition(List,areMutuallyExclusive());
Assert.assertEquals(预期、实际);
}
}
你能提供一些例子吗?你描述中的语言似乎到处都是。保持一致。当你说拆分为多个列表时,你的意思是根据互斥条件对原始列表进行分区吗?另外,第2点讨论了子列表。什么是子列表?你是指分区的子集吗。那么,您是说分区的一个子集中的元素不能位于同一分区的另一个子集中(互斥)?如果是这样的话,您本质上是在描述分区的定义。互斥条件是否总是导致布尔值?如果是这样,条件将产生两个子集。或者这种情况会导致两个以上的值吗?请向我们展示您迄今为止尝试过的代码。例如,1。原始清单[A、B、C]2。A和C是互斥的,A和B不是互斥的,B和C不是互斥的3。它可以分为[A]、[B,C]或[C]、[A,B]4种。不要拆分为[A]、[B]、[C],因为拆分后的子列表总数不是最小值