像小数一样递增 int 列表的最聪明的方法

Smartest way to increment an int list like a decimal

我有一个看起来像这样的列表:[1, 1, 1, 1]。尺寸已知且固定。

我想这样增加列表:

[1, 1, 1, 1]
[2, 1, 1, 1]
...
[9, 1, 1, 1]
[1, 2, 1, 1]
[2, 2, 1, 1]
...
[9, 9, 1, 1]
[1, 1, 2, 1]
...
[9, 9, 9, 9]

最好的方法是什么?我已经构建了这个功能,但我想它可以改进 :

private static void incr(List<Integer> list) {
    int i = 0;
    boolean stop = false;
    while (i < list.size() && !stop) {
        if (list.get(i) < 9) {
            list.set(i, list.get(i) + 1);
            stop = true;
        } else {
            list.set(i, 1);
            i++;
        }
    }
}
  • 把你的“停止”换成“休息”;声明。
  • 那么你也可以使用for循环,这样你就不需要事先单独定义i了。

不是真的好,而是短了一点。

private static void incr(List<Integer> list) {
    for (int i=0; i <list.size(); i++) {
        if (list.get(i) < 9) {
            list.set(i, list.get(i) + 1);
            break;
        }
        list.set(i, 1);
    }
}

这是一个小列表,所以您所拥有的基本没问题。

您在“大型”非 RandomAccess 列表中可能遇到的唯一问题是重复访问第 i 个元素。

您可以将 list.get(i) 提取到一个变量中,这样每次迭代只需调用一次。请注意,您只在最后一次迭代中调用它两次,所以这基本上是无关紧要的。

您可以使用 ListIterator,它在所有列表实现上都非常有效,甚至是非 RandomAccess 列表实现,例如 LinkedList:

for (ListIterator<Integer> it = list.listIterator(); it.hasNext();) {
  int value = it.next();
  if (value < 9) {
    it.set(value + 1);
    break;
  }

  it.set(1);
}

但重申一下:您已经几乎可以肯定很好。