我正试图用ArrayList
实现计数排序算法,但我遇到了一些困难。
在这段代码中,我想计算ArrayList
中名为l
的每个元素的出现次数。
我的代码:
List<Integer> l = // initializing the given list
/** initialize the occurrence of each element in the count array **/
List<Integer> count = new ArrayList<>(max-min+1);
for(int i = 0; i < l.size(); i++){
//count[arr[i]-min]++;
int index = l.get(i) - min; //ok
int value = 0;
value = value++;
count.set(index, value);
}
我找不到如何执行增量。
通过使用允许提供容量的ArrayList
的参数化构造函数,您仍然可以得到空的ArrayList
。不同之处在于,它将具有所需大小的底层数组,而不是默认大小的10
。
但是您仍然没有可访问的元素。为了用默认值填充ArrayList
,可以使用另一个允许提供集合的参数化构造函数。
要创建一个大小为max - min + 1
、填充有零整数(将传递给构造函数(的轻量级辅助列表,可以使用实用程序方法Collections.nCopies()
:
List<Integer> count = new ArrayList<>(Collections.nCopies(0, max - min + 1));
for (int i = 0; i < l.size(); i++) {
int index = l.get(i) - min;
int value = count.get(index);
count.set(index, value + 1);
}
注意坦率地说,用ArrayList
而不是平面数组来实现计数排序不是很方便。如果是分配要求或自我施加的挑战,请确保您了解如何使用数组实现算法。
有不同的方法来增加原始数值变量,例如value
value++
是其中之一,另外导致value
的值在增量之前
我必须了解是否定义了递增value
和分配给value = value++
中的值之间的序列-
理智建议避免这样做。
我在下一步时使用递增运算符,在下一个处使用
,在value += 1
处使用加1
(另一个最短的是++value
……产生增量后的值。(
当在给定索引i
处递增List<Integer> values
中的值时,有两种可能性:
要么显式get()
和set()
,像Alexander Ivanchenko建议的那样依赖于自动(非(拳击,
,要么使用可变整数-java.util.concurrent.atomic.AtomicInteger
有set(newValue)
、getAndIncrement()
和incrementAndGet()
。