1

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

我正在尝试遍历排序数组,如果前一个数字 == 当前数字,它将计数存储在新数组的位置 n 中;当前一个数字 != 当前数字时,它会移动到新数组上的 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

4 回答 4

2

我现在正在调试它,但无法弄清楚它不起作用。任何帮助深表感谢。

这里给你一个线索:

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

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

线索 2:如果您的意图是previousNumber包含您当前计数的数字,则需要在循环之外对其进行初始化,并在当前数字更改时更新。

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

根据您的问题,我想说您对自己编写的代码的思考/理解是毛茸茸的。这就是您在调试它时遇到困难的原因。

为了有效地调试一段代码,您首先需要一个关于它应该如何工作的心智模型。然后,您使用调试器观察关键点发生的情况,以确认程序的行为符合您的预期。

(如果您在没有心智模型的情况下进入调试过程,您所看到的只是语句执行、变量更改等等......没有任何东西可以告诉您是否正在发生正确的事情。这就像在一部老电影……没有启发性。)

于 2013-09-03T03:53:38.400 回答
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;
        }
    }
于 2013-09-03T03:35:19.967 回答
1

我会选择一个哈希图,其中键是数字,其值是计数。这样你就有了一个唯一的数字和计数。您的解决方案遇到了一个问题,您在索引 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);
于 2013-09-03T03:00:05.977 回答
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;
于 2013-09-03T03:32:36.563 回答