2014-02-21 50 views
0

令人烦恼的是,这个问题很容易,但今天一直令我头痛。 (道歉的伪代码)布尔数组的所有组合

说我们有布尔,a和两个数组列表b其中:

a = [true, true, false]

b = [true, false, true]

我想产生的所有组合的列表ab之间的比较与以下规则:

  • 如果a[i] = trueb[i] = true产生的result[i]应该总是返回true
  • 如果a[i] = falseb[i] = false总是返回false
  • 如果a[i] != b[i]返回列表,其中一个result[i]true而另一个是false

所以对于compare(a,b)预期的结果将是(我希望...):

[true, true, false], 
[true, false, false], 
[true, true, true], 
[true, false, true] 

我试图做到这一点在Java中,但似乎无法正常循环,任何人都可以给我一些帮助?

编辑:

另一个简单的例子,对于规则3:

a = [true, false] 
b = [false, true] 

results: 

[true, false] 
[false, true] 
[true, true] 
[false, false] 

基本上这就是我的意思:)

+1

应该不是最后一个是'[真,假,真]'? –

+0

不能理解输出。它不能正确。 false + true = false,false + false = false,false + true = false,true + false = false,true + false = false。如果将数组a中的每个元素与数组b中的每个元素相结合,则会得到5次错误。但你的输出只显示4次。 – kai

+0

3^2 +数组a的给出了两次列表,并且数组a的两个真都给出了一个列表,所以在结果中有13个值不是12。 – kai

回答

1

递归是解决这类组合问题的经典方法。

void resursivelyCombine(List<List<Boolean>> result, List<Boolean> current, List<Boolean> in1, List<Boolean> in2, int index) { 
    if (index == in1.size()) { 
     result.add(current); 
    } else { 
     if (in1.get(index).equals(in2.get(index))) { 
      current.add(in1.get(index)); 
      recursivelyCombine(result, current, in1, in2, index+1); 
     } else { 
      List<Boolean> temp = new ArrayList<>(current); 
      temp.add(Boolean.TRUE); 
      recursivelyCombine(result, temp, in1, in2, index+1); 

      temp = new ArrayList<>(current); 
      temp.add(Boolean.FALSE); 
      recursivelyCombine(result, temp, in1, in2, index+1); 
     } 
    } 
} 

类似的东西:)代码可能需要一点整理,因为我只是在这里输入它未经测试。

这样称呼它:

List<List<Boolean>> results = new ArrayList<>(); 
recursivelyCombine(results, new ArrayList<Boolean>(), in1, in2, 0); 
+0

我还没有测试这个彻底,但它似乎你明白我在试图穿过!这看起来几乎肯定是正确的解决方案,但一旦证实我会回复给你,并将答案标记为接受,如果适用的话:) –

2

我想说的递归。我不知道什么是你的目标在性能和多长时间将是数组,但我会做类似如下:

1,步骤:创建一个数组,其中一些元素是固定的,一些被标记为您的规则,这样的暧昧:

[Boolean.True, null, null] 

这意味着那里是null应该是true 假。

2,步骤:在用于null的最后一次出现的方法搜索,将其改为Boolean.True并调用与该阵列的方法相同。在下一行中将其更改为Boolean.False并再次调用相同的方法。在这个新的调用中,将会有一个更少的空元素,并且您在模糊空间中获得了具有Boolean.TrueBoolean.False元素的数组。

3,步骤:在该方法中,还检查数组中是否不存在更多null值,如果没有,则将其写入输出。

当然不是Booleannull值,你可以使用别的或更有意义的对象,你也可以以迭代的方式做到这一点,但我不知道你的问题的细节。

希望我能帮上忙。