计算数组中的Int出现次数

时间:2013-09-12 08:11:06

标签: java arrays find-occurrences

我正在尝试计算数组中整数的出现次数。我能够通过拼凑我在网上发现的一些代码来实现它,但我真的不明白为什么它的工作。我所拥有的是:

int[] hand = {2, 4, 3, 2, 4};
int[] numOccurence = new int[hand.length];


    for (int i = 0; i < hand.length; i++)
        numOccurence[hand[i]]++;

    for (int i = 1; i < numOccurence.length; i++)
        if (numOccurence[i] > 0)
            System.out.println("The number " + i + " occurs " + numOccurence[i] + " times.");

输出是: 数字2出现2次。 数字3出现1次。 数字4出现2次。

这段代码如何正确计算出现次数?我不知道它是如何实现这一目标的。提前谢谢!

7 个答案:

答案 0 :(得分:3)

这只是因为祝你好运。尝试将手数组中的第二个元素设为5,看看会发生什么。这是因为当前索引hand处出现的数字被视为数组numOccurence的索引。如果数字大于或等于numOccurence的长度,您将获得ArrayIndexOutOfBoundsException

因此,您可以更好地使用Map,其中密钥是数字,值可能是其数量。

这样的事情: -

Map<Integer, Integer> numOccurence = new HashMap<Integer, Integer>();
for (int i = 0; i < hand.length; i++) {
    int cnt = 1;
    if (numOccurence.containsKey(hand[i])) {
        cnt = numOccurence.get(hand[i]);
        cnt++;
    }
    numOccurence.put(hand[i], cnt);
}

答案 1 :(得分:3)

此代码不起作用。至少它适用于作者的用例,但可能不属于你的用例。

尝试将{2, 4, 99, 2, 4};作为hand,然后失败。

作者将hand中的数字作为数组numOccurence的索引。 numOccurence具有以下结构:{nb occ 0 ; nb occs of 1 ; ...; nb的 4 }。这里99将超出范围。

答案 2 :(得分:1)

创建数组时

int[] numOccurence = new int[hand.length];

它由默认值填充。对于原始int,此值为0.

这当然只有在手包含小于或等于数组的最大索引(长度-1)的数字时才有效,否则它就是你的阵列的ArrayIndexOutOfBound!

答案 3 :(得分:0)

实际上它与为图片创建直方图的方法相同;)

您可以创建一个表格来收集事件。  numOccurence [0]将存储0的数字  numOccurence [1]将库存数量为1 等

这是由

完成的
for (int i = 0; i < hand.length; i++)
    numOccurence[hand[i]]++;

它对应于数字hand [i]

的情况下的值加1

所以如果你一步一步看 首先他将采取手[0] = 2 所以他会把

numOccurence[2] = numOccurence[2] + 1 ;

相同(但写入速度更快)
numOccurence[2]++; 

答案 4 :(得分:0)

这种执行计数称为counting sort

计算排序的好处是它的速度。缺点是对大数字进行排序时的内存要求。

代码中存在错误:

int[] numOccurence = new int[hand.length];

numOccurence需要与列表中的最大数字一样长(而不是列表中的数字)。尝试将其中一个数字更改为15,您将获得例外。

答案 5 :(得分:0)

首先,代码是错误的。您应该将numOccurence数组的大小设置为hand数组+ 1的最大数值。例如:

int[] hand = {2, 100};
int[] numOccurence[] = new int[101];

(显然你应该以编程方式找到最大数字)

现在让我们来看看算法。 它从hand数组中获取每个数字,将其视为numOccurence索引值,并在hand数组中将该索引处的数字增加1。请注意,默认情况下,numOccurence数组的所有元素都是0

int[] hand = {2, 4, 3, 2, 4};
int[] numOccurence = new int[5];

步骤:

i = 0(没有任何反应,因为hand数组中没有0)

i = 1(与0相同的情况)

i = 22数组中有两个hand个数字,因此我们执行两次numOccurence[2] += 1次操作,结果为0 + 1 + 1 = 2。我们得到numOccurence[2] = 2

0hand数组的最大数字(此处为100),所有数字都会继续。

答案 6 :(得分:0)

代码遍历给定的数组hand。它将每个遇到的值作为数组numOccurrence的索引。对于n中的每个数字hand,这种情况与n中出现hand的情况完全相同,每次发生这种情况时,都会n numOccurrence将会增加。

因此numOccurrence实际上是一个计数器数组(假设数组元素用0初始化)。

这种方法的缺点是:

  • 分配的计数器数量取决于hand数组中的数字大小。
  • 如果hand数组中的数字稀疏地分布,则大多数分配的空间永远不会被使用。

替代

您可以先排序hands来改进代码。在排序数组中,给定数字的所有出现的索引都是连续的,因此只需要一个计数器就可以扫描已排序的数组,以便编译频率。