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],因为拆分后的子列表总数不是最小值 谁能帮我?据我所知,您希望根据集合中任意两个元素之间的任意比较

有一个列表,其中元素根据特定条件相互排斥

  • 现在我需要根据这个互斥条件将其拆分为多个列表

  • 分区后,互斥元素不能出现在子列表中

  • 分段后的子列表数量应最小化

  • -------------比如说----------------------

  • 原始清单[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],因为拆分后的子列表总数不是最小值