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

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

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

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

但它印的像

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

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

  1. @Override
  2. public Integer next() {
  3. if (!hasNext())
  4. throw new NoSuchElementException();
  5. else if(columnIndex == dataset[rowIndex].length-1){
  6. return dataset[rowIndex++][columnIndex = 0];
  7. }else {
  8. return dataset[rowIndex][columnIndex++];
  9. }
  10. }

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

ih99xse1

ih99xse11#

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

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

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

  1. class Matrix implements Iterator<Integer> {
  2. private Integer[][] dataset;
  3. private AtomicInteger rowIndex;
  4. private AtomicInteger columnIndex;
  5. public Matrix(Integer[][] data) {
  6. this.dataset = data;
  7. rowIndex = new AtomicInteger(0);
  8. columnIndex = new AtomicInteger(0);
  9. }
  10. @Override
  11. public boolean hasNext() {
  12. return rowIndex.get() < dataset.length
  13. && columnIndex.get() < dataset[rowIndex.get()].length;
  14. }
  15. @Override
  16. public Integer next() {
  17. if (!hasNext())
  18. throw new NoSuchElementException();
  19. else if(columnIndex.get() == dataset[rowIndex.get()].length - 1) {
  20. return dataset[rowIndex.getAndIncrement()][columnIndex.getAndSet(0)];
  21. }
  22. return dataset[rowIndex.get()][columnIndex.getAndIncrement()];
  23. }
  24. }

测试:

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

输出:

  1. 1 2 3
  2. 4 5 6
  3. 7 8 9
展开查看全部
f1tvaqid

f1tvaqid2#

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

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

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

相关问题