如何将此布尔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。
感谢您提供任何帮助/建议。
答案 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))
中运行。