迭代排序的数组并存储不同整数的计数

时间:2013-09-03 02:54:53

标签: java

有人可以回答我的具体问题吗,我不能使用课堂上没有涉及的材料,必须这样做。

我正在尝试迭代已排序的数组,如果前一个数字==当前数字,它将计数存储在新数组的可能性中;当前一个数字!=当前数字时,它会在新数组上移动到n + 1并再次开始计数。

我现在正在调试它,但无法解决它不起作用的问题。任何帮助深表感谢。

    // Get the count of instances.
    int[] countOfNumbers = new int[50];         // Array to store count
    int sizeOfArray = 0;                        // Last position of array filled
    int instanceCounter = 1;                    // Counts number of instances
    int previousNumber = 0;                     // Number stored at [k-1]

    for (int k=1; k < finalArrayOfNumbers.length; k++) {
        previousNumber = finalArrayOfNumbers[k-0];

        if (previousNumber == finalArrayOfNumbers[k]) {

            instanceCounter++;
            countOfNumbers[sizeOfArray] = instanceCounter;

        }

        instanceCounter = 1; 
        sizeOfArray++;
        countOfNumbers[sizeOfArray] = instanceCounter;

不要担心映射或任何事情,我只需要知道如果我有一个数组:

[20,20,40,40,50]

我可以回来了

[2,2,1]

4 个答案:

答案 0 :(得分:2)

Java API中有许多简洁的工具,因此您可以避免自己做很多事情:

    List<Integer> list = Arrays.asList(20, 20, 40, 40, 50);
    Map<Integer, Integer> freq = new LinkedHashMap<>();
    for (int i: list) {
        freq.put(i, Collections.frequency(list, i));
    }
    System.out.println(freq.values());

那就像你想要的那样打印[2, 2, 1]

或者,如果您只想列出列表中的不同值,则可以使用Set的实现。

但是因为你是受限制的,因为这是一个课程作业,你可以这样做:

    int[] a = { 20, 20, 40, 40, 50 };
    int[] freq = new int[a.length];
    // count frequencies
    for (int i = 1, j = 0, count = 1; i <= a.length; i++, count++) {
        if (i == a.length || a[i] != a[i - 1]) {
            freq[j++] = count;
            count = 0;
        }
    }
    // print
    for (int i = 0; i < freq.length && freq[i] != 0; i++) {
        System.out.println(freq[i]);
    }

输出仍然相同。

我在你关闭的两个地方放了评论,这是你的固定代码。

    for (int k = 1; k < finalArrayOfNumbers.length; k++) {
        previousNumber = finalArrayOfNumbers[k - 1]; // changed 0 to 1
        if (previousNumber == finalArrayOfNumbers[k]) {
            instanceCounter++;
            countOfNumbers[sizeOfArray] = instanceCounter;
        } else { // put this last bit in an else block
            instanceCounter = 1;
            sizeOfArray++;
            countOfNumbers[sizeOfArray] = instanceCounter;
        }
    }

答案 1 :(得分:2)

  

我现在正在调试它,但无法解决它不起作用的问题。任何帮助深表感谢。

以下是您的线索:

      previousNumber = finalArrayOfNumbers[k-0];
      if (previousNumber == finalArrayOfNumbers[k]) {

线索:'k - 0'与上面的'k'具有相同的值。

线索2:如果你的意图是previousNumber包含你当前正在计算的数字,那么它需要在循环的进行初始化,并且更新当前数字改变时。

线索3:你不应该在每次循环迭代中增加sizeOfArray ...

根据您的问题,我会说您对所编写的代码的思考/理解是 woolly 。这就是你在调试时遇到困难的原因。

为了有效地调试一段代码,首先需要一个心理模型来确定应该的工作方式。然后使用调试器观察确认关键点发生的事情,该程序正如您所期望的那样。

(如果你在没有心理模型的情况下进入调试过程,你所看到的就是执行语句,变量变化等等......没有任何东西可以告诉你是否正确的事情发生了。就像看着闪烁的灯光一样旧电影中的电脑......没有启发性。)

答案 2 :(得分:1)

我会选择一个hashmap,其中键是数字,其值是计数。这样您就拥有了一个独特的数字和数量。你的解决方案会遇到一个问题,你不知道索引i,这个数字属于什么计数,除非你的列表没有重复,顺序没有间隙,如1,2,3,4,5相对对于1,1,1,1,5,5,5,5的情况

HashMap<Integer, Integer> occurances = new HashMap>Integer, Integer>();
int[] someSortedArray = new int[10];

//fill up a sorted array
for(int index = 0; index < someSortedArray.length; index++)
{
    someSortedArray[index] = index+1;
}

int current = someSortedArray[0];
int count = 1;
for(int index = 1; index < someSortedArray.length; index++)
{
    if(someSortedArray[index] != current)
    {
        occurances.put(current, count);
        current = someSortedArray[index];
        count = 1;
    }else
    {
        count++;
    }
}

System.out.println(occurances);

答案 3 :(得分:0)

我认为应该这样做(没有编译)。 你没有在for循环中的任何地方增加sizeOfArray。

// Get the count of instances.
int[] countOfNumbers = new int[50];         // Array to store count
int sizeOfArray = 0;                        // Last position of array filled
int instanceCounter = 1;                    // Counts number of instances
int previousNumber = finalArrayOfNumbers[0]; // Number stored at [k-1]

for (int k=1; k < finalArrayOfNumbers.length; k++) {
    if (previousNumber == finalArrayOfNumbers[k]) {
        instanceCounter++;
    }
    else
    {
       countOfNumbers[sizeOfArray] = instanceCounter;
       instanceCounter = 1; 
       sizeOfArray++;
       previousNumber = finalArrayOfNumbers[k]
    }
 }

 countOfNumbers[sizeOfArray] = instanceCounter;