我有大量的布尔值,我只需要使用真正的元素,并且需要theyer索引。
for (int x = 0; x < cells.length; x++) {
for (int y = 0; y < cells[0].length; y++) {
if (cells[x][y]) {
g.fillRect(x * cellSize, y * cellSize, cellSize, cellSize);
}
}
}
所以如果没有两个foor循环我怎么能这样做并节省时间?
答案 0 :(得分:2)
我会说这是你能得到的最好的。
您已经在使用原始数组,我希望使用原始布尔类型。
我唯一能建议的是在循环之前将cells.length
和cells[0].length
保存在final
变量中,它可以节省一些时间,但编译器可能已经自行优化了这一点。
答案 1 :(得分:0)
不幸的是,由于你的要求,你被困在 O(n)
......意思是,你必须观察一次数组中的每个值,找到所有cells
有一个true
值
答案 2 :(得分:0)
您可以实现一些数组包装器,它将链接true
值(以设置操作为代价),这样您就只能迭代true
个索引。
答案 3 :(得分:-1)
我们可以这样做,将int [array]转换为String并找到1存在的索引。基于索引执行操作。
String arrayStr=Arrays.toString(cells[0].length);
String booleanVal="1";
int index = word.indexOf(booleanVal);
while(index >= 0) {
if (cells[x][index]) {
g.fillRect(x * cellSize, index * cellSize, cellSize, cellSize);
}
index = word.indexOf(arrayStr, index+1);
}
答案 4 :(得分:-1)
通过这个你的内部for循环运行n / 4次。它节省了时间..
为| cells [0] .length / 2 |传递一个整数值。
/ ********************* * /
for (int y=0, oddOccurLeft = cells[0].length/2,oddOccurRight = cells[0].length/2, evenOccurLeft=cells[0].length/2,evenOccurRight=cells[0].length/2; ;y++ ) {
if (cells[x][oddOccurLeft]) {
g.fillRect(x * cellSize, oddOccurLeft * cellSize, cellSize, cellSize);
}
if (cells[x][oddOccurRight]) {
g.fillRect(x * cellSize, oddOccurRight * cellSize, cellSize, cellSize);
}
if (cells[x][evenOccurLeft]) {
g.fillRect(x * cellSize, evenOccurLeft * cellSize, cellSize, cellSize);
}
if (cells[x][evenOccurRight]) {
g.fillRect(x * cellSize, evenOccurRight * cellSize, cellSize, cellSize);
}
***if(oddOccurLeft<0 && oddOccurRight<0 && oddOccurRight>cells[0].length && evenOccurLeft>cells[0].length && evenOccurRight>cells[0].length)
break;***
oddOccurLeft=oddOccurLeft-y*2+1;
oddOccurRight=oddOccurRight+y*2+1;
evenOccurLeft=evenOccurLeft-y*2;
evenOccurRight=evenOccurRight+y*2;
}