如何根据依赖于列表的布尔值更改2d列表的特定行

时间:2012-02-01 22:34:58

标签: java arrays list multidimensional-array arraylist

如何将此布尔T / F检查合并到此代码中,而不通过整个arraylist>?

情况如下;

arraylist<arraylist<Integer>> bigArray....elig arraylist<Boolean>
elig.size() == bigArray.get(0).size();
bigArray is rectangular (i.e. no differing sizes of interior Lists

我的代码如下:

for(int j=0; j<(bigArr.size()); j++) {  //lets assume this is ==10           
  for(int e=0; e<(ballotArr.get(0).size()); e++) {   //assume == 5
    if(elig.get(e) == false) {          
        for(int k=0; k<(ballotArr.get(0).size()); k++) {  //==5
            bigArr.get(j).set(k, big.get(j).get(k)-1);
        }
    }
  } 
}

可以清楚地看到,这将循环通过最内部循环10次,任何时候elig.get(e)== false,并从所有索引中减去。

elig.get(e)在for(int k)处理时保持稳定值,然后获得下一个值(至少我相信这是解决方案)是必要的。

目标是从特定列中值为1的所有行中减去1。

感谢您提供任何帮助/建议。

1 个答案:

答案 0 :(得分:0)

使用库实现,可以略微加快速度。使用自定义集合可以使这更快,但这里的范围超出了范围。你 对某些迭代约束,所以在任何情况下你都可以这么做。

将程序分解为更小的方法会很有帮助:

public static void decrementColumns(List<List<Integer>> rows, List<Boolean> mask) {
    final List<Integer> maskIndicies = getMaskIndicies(mask);
    // We're locked into this iteration because we have to modify every row.
    for (List<Integer> row : rows) {
        apply(maskIndicies, row);
    }
}

// Your big savings will come from figuring out the indicies.
// This allows us to make the iterations-per-row smaller - 
//   assuming not every row (or even most) is set to 'true'!
public static List<Integer> getMaskIndicies(List<Boolean> mask) {
    final List<Integer> maskIndicies = new ArrayList<Integer>(mask.size());
    for (int i = 0; i < mask.size(); i++) {
        if (mask.get(i)) {
            maskIndicies.add(i);
        }
    } 
}

public static void apply(List<Integer> maskIndicies, List<Integer> row) {
    // We're locked into this iteration, needing to apply the transformation
    // to every column included.
    for (Integer index : maskIndicies) {
        final Integer modified = row.get(index) - 1;
        row.set(index, modified);
    }
}

请注意,这是 NOT 线程安全,所以要小心。我也没有写任何安全检查,所以......

<小时/> 编辑:

重新阅读问题后,我意识到我最初误读了代码正在做的事情(而且我自己踢了 - 不知怎的,我放弃了一个循环)。

修订版:

public static void decrementColumns(List<List<Integer>> rows, List<Boolean> mask) {
    final int count = getMaskCount(mask);
    // We're locked into this iteration because we have to modify every row.
    for (List<Integer> row : rows) {
        apply(row, count);
    }
}

public static void int getMaskCount(List<Boolean> mask) {
    int count = 0;
    for(Boolean flag : mask) {
        if (!flag) {
            count++;
        }
    }
    return count;
}

public static void apply(List<Integer> row, int count) {
    for (int index = 0; index < row.size(); index++) {
        final Integer modified = row.get(index) - count;
        row.set(index, modified);
    }
}

请注意,此仍然并没有完全按原样代码执行操作,只是我假设您正在尝试做的事情,因为您的& #39;要求&#39;文本。首先,你定义了至少 2 附加列表,你没有给出关系 - 其中一个我很确定是一个错字。如果您为了清晰起见而编辑问题,我可能会提供更好的答案;在您的代码和问题文本之间发生了一些含糊不清或相互矛盾的事情。请注意,虽然原始代码在O(m * (n ^ 2))中运行,但最小值(和我的版本)在O(n + (m * n))中运行。