在布尔数组中迭代trues的快速方法

时间:2017-09-14 12:38:26

标签: java arrays performance boolean

我有大量的布尔值,我只需要使用真正的元素,并且需要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循环我怎么能这样做并节省时间?

5 个答案:

答案 0 :(得分:2)

我会说这是你能得到的最好的。

您已经在使用原始数组,我希望使用原始布尔类型。

我唯一能建议的是在循环之前将cells.lengthcells[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;

   }