像小数一样递增 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);
}
但重申一下:您已经几乎可以肯定很好。
我有一个看起来像这样的列表:[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);
}
但重申一下:您已经几乎可以肯定很好。