有人可以回答我的具体问题吗,我不能使用课堂上没有涉及的材料,必须这样做。
我正在尝试迭代已排序的数组,如果前一个数字==当前数字,它将计数存储在新数组的可能性中;当前一个数字!=当前数字时,它会在新数组上移动到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]
答案 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;