java—有没有一种方法可以实现x++而不是用更大的数字操作?

fcwjkofz  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(365)

我试图实现一个返回矩阵字符串的方法。字符串应该是

[0, 1, 2]
[3, 4, 5]
[6, 7, 8]

但它印的像

[0, 1, 0]
[3, 4, 3]
[6, 7, 6]

问题是迭代器的next()方法。

@Override
public Integer next() {
    if (!hasNext())
        throw new NoSuchElementException();
    else if(columnIndex == dataset[rowIndex].length-1){
        return dataset[rowIndex++][columnIndex = 0];
    }else {
        return dataset[rowIndex][columnIndex++];
    }
}

它使 columnIndex = 0 之前 rowIndex++ 完成了。我试着换衣服 ++rowIndex 但我没能达到我想要的。那么,有办法吗 columnIndex = 0 同时 rowIndex++ 工作,而不是 ++rowIndex ?

ih99xse1

ih99xse11#

行中似乎需要后赋值(类似于后增量)这样的操作:

return dataset[rowIndex++][columnIndex = 0];

即,当前值 columnIndex 返回,然后将其重置为0。
这样的操作对基元不可用 int 但是阶级 AtomicInteger Package 内 java.util.concurrent.atomic 提供与方法类似的功能 getAndSet() so方法 next() 如果 rowIndex 以及 columnIndex 已更改为 AtomicInteger :

class Matrix implements Iterator<Integer> {
    private Integer[][] dataset;
    private AtomicInteger rowIndex;
    private AtomicInteger columnIndex;

    public Matrix(Integer[][] data) {
        this.dataset = data;
        rowIndex = new AtomicInteger(0);
        columnIndex = new AtomicInteger(0);
    }

    @Override
    public boolean hasNext() {
        return rowIndex.get() < dataset.length 
               && columnIndex.get() < dataset[rowIndex.get()].length;
    }

    @Override
    public Integer next() {
        if (!hasNext())
            throw new NoSuchElementException();
        else if(columnIndex.get() == dataset[rowIndex.get()].length - 1) {
            return dataset[rowIndex.getAndIncrement()][columnIndex.getAndSet(0)];
        }

        return dataset[rowIndex.get()][columnIndex.getAndIncrement()];
    }
}

测试:

Matrix m = new Matrix(new Integer[][] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3 && m.hasNext(); j++) {
        System.out.print(m.next() + "  ");
    }
    System.out.println();
}

输出:

1  2  3  
4  5  6  
7  8  9
f1tvaqid

f1tvaqid2#

如果你想读难懂的魔术,可以使用整数除法和模运算:

@Override
public Integer next() {
    if (!hasNext())
        throw new NoSuchElementException();
    return [index / dataset[0].length][index++ % dataset[0].length];
}

哪里 index 从0开始。这种方法仅适用于矩形阵列,但我假设它是数学意义上的矩阵,因此所有行的元素数都相同。

相关问题