Java 留在for循环中第一个元素的百分比计算

Java 留在for循环中第一个元素的百分比计算,java,foreach,frequency,Java,Foreach,Frequency,编辑:添加代码以显示频率计数 这不是家庭作业。我这样做是为了好玩 我希望这段代码足够了,但我遇到了一个奇怪的问题。我计算了数组中每个数字的频率,这很好。嗯,我想看看这些频率的百分比,所以我创建了一个小方法来计算它 因为第一个元素的频率是42,我的总字符数是1553,所以它为每个元素打印了2.7%,而不是为不同的频率而改变 我在调试期间设置了断点,一旦频率计数器计算出第一个元素的频率,该值将与其余元素保持一致。O.O 我尝试在百分比计算之外放置一个for循环,它做了完全相同的事情。它从未脱离第一个

编辑:添加代码以显示频率计数

这不是家庭作业。我这样做是为了好玩

我希望这段代码足够了,但我遇到了一个奇怪的问题。我计算了数组中每个数字的频率,这很好。嗯,我想看看这些频率的百分比,所以我创建了一个小方法来计算它

因为第一个元素的频率是42,我的总字符数是1553,所以它为每个元素打印了2.7%,而不是为不同的频率而改变

我在调试期间设置了断点,一旦频率计数器计算出第一个元素的频率,该值将与其余元素保持一致。O.O

我尝试在百分比计算之外放置一个for循环,它做了完全相同的事情。它从未脱离第一个频率计数器

   System.out.println(" FREQUENCY COUNT RESULT");
    Collections.sort(array);

    Hashtable<Integer, Integer> table = new Hashtable<>();

    for (int i = 0; i < array.size(); i++) {
        if (table.containsKey(array.get(i))) {
            count = table.get(array.get(i));
            table.put(array.get(i), ++count);
        } else {
            table.put(array.get(i), 1);
        }
    }
    set = table.keySet();
    count = 0;
    for (Integer n : set) {
        count = table.get(n);
        System.out.println(n + ": Frequency - " + count);
    }
    System.out.println("TOTAL CHARACTERS IN ARRAY: " + countNonSpaces(array));
    System.out.println();
    System.out.println("PERCENTAGE REPORT");
    for(Integer n : set) {
        System.out.println(n + " Percentage: " + getPercentage(count, tally) + "%");
    }
}
public static double getPercentage(int count, int tally) {

    percentCounter = (count * 100.0) / tally;
    percentCounter = percentCounter * 100;
    percentCounter = Math.round(percentCounter);
    percentCounter = percentCounter / 100;
    return percentCounter;
}
public static int countNonSpaces(ArrayList<Integer> array) {

    for (int i = 0; i < array.size(); i++) {
        if (array.get(i) != ' ') {
            tally++;
        }
    }
    return tally;
}

在打印循环中传递给getPercentage的计数变量在循环的任何阶段都不会得到更新

您需要将get count添加到for循环的打印百分比中,就像for循环的打印频率一样

for(Integer n : set) {
        count = table.get(n);  // add this line in the loop for printing percentage
        System.out.println(n + " Percentage: " + getPercentage(count, tally) + "%");
    }

在打印循环中传递给getPercentage的计数变量在循环的任何阶段都不会得到更新

您需要将get count添加到for循环的打印百分比中,就像for循环的打印频率一样

for(Integer n : set) {
        count = table.get(n);  // add this line in the loop for printing percentage
        System.out.println(n + " Percentage: " + getPercentage(count, tally) + "%");
    }

您正在一个集合中循环,但不使用该集合中的任何值

for(Integer n : set) {
    System.out.println(n + " Percentage: " + getPercentage(count) + "%");
}
很难从代码中分辨出来,但如果集合中包含了频率和计数,则可以计算出来

for(SomeObj n : set) {
    System.out.println(" Percentage: " + getPercentage(n.tally, n.count) + "%");
}

基本上计算百分比时,您需要计数和计数。每行的计数和计数将不同,因此需要同时存储在集合中。

您在集合中循环,但不使用该集合中的任何值

for(Integer n : set) {
    System.out.println(n + " Percentage: " + getPercentage(count) + "%");
}
很难从代码中分辨出来,但如果集合中包含了频率和计数,则可以计算出来

for(SomeObj n : set) {
    System.out.println(" Percentage: " + getPercentage(n.tally, n.count) + "%");
}

基本上计算百分比时,您需要计数和计数。每行的计数和计数将不同,因此需要同时存储在您的集合中。

编辑添加代码以显示最频繁出现的情况

好吧,我睡过了,今天早上又试了一次。我设置了断点来查看发生了什么,计数器停留在第一个元素上,在这种情况下是整数39,出现次数为42次。每个百分比显示为42/1558的百分比(不包括空格的所有字符的计数)。 由于百分比基本上与计数相同,只是除以计数,我完全放弃了百分比方法,再次循环元素,并确保在进入第二个循环之前重置计数器。以下是更改后的代码(仅包括count和tally方法。另一个方法是getFileInfo(),它仅从文本文件中获取数字并将其放入数组):


谢谢你帮我转动齿轮。非常感谢。:-)

编辑添加代码以显示最频繁的事件

好吧,我睡过了,今天早上又试了一次。我设置了断点来查看发生了什么,计数器停留在第一个元素上,在这种情况下是整数39,出现次数为42次。每个百分比显示为42/1558的百分比(不包括空格的所有字符的计数)。 由于百分比基本上与计数相同,只是除以计数,我完全放弃了百分比方法,再次循环元素,并确保在进入第二个循环之前重置计数器。以下是更改后的代码(仅包括count和tally方法。另一个方法是getFileInfo(),它仅从文本文件中获取数字并将其放入数组):


谢谢你帮我转动齿轮。非常感谢。:-)

告诉我们打印频率的代码@马特-编辑以显示frequency@csheridan我看到你也按照我的答案编辑了你的
getPercentage
方法
getPercentage(整数计数,整数计数)
-干得好你所有频率的总和(54+33+37+…)不等于1553。你有10个值都在54以下;这不能超过540。您在一个名为
array
的变量中计算频率,但似乎是从名为
set
的变量中打印频率。此外,当您打印“百分比”时,变量
count
的值保留为打印“频率”时的最后一个值。@SciProg I仅显示了其中的几个值(实际上有39个不同的数字),计数不是总和,而是字符计数。数组中有1553个数字,不是1553的和。:-)如果你往下看我的答案,我说“为了简洁起见,我不会显示每个整数…”我只显示了其中的10个,而不是用所有78个打印语句浪费空间。给我们显示打印频率的代码@马特-编辑以显示frequency@csheridan我看到你也按照我的答案编辑了你的
getPercentage
方法
getPercentage(整数计数,整数计数)
-干得好你所有频率的总和(54+33+37+…)不等于1553。你有10个值都在54以下;这不能超过540。您在一个名为
array
的变量中计算频率,但似乎是从名为
set
的变量中打印频率。此外,当您打印“百分比”时,变量
count
的值保留为打印“频率”时的最后一个值。@SciProg I仅显示了其中的几个值(实际上有39个不同的数字),计数不是总和,而是字符计数。有1553个号码
FREQUENCY COUNT RESULT
10: Frequency - 54
9: Frequency - 33
8: Frequency - 37
7: Frequency - 43
6: Frequency - 36
5: Frequency - 37
4: Frequency - 41
3: Frequency - 50
2: Frequency - 39
1: Frequency - 42

PERCENTAGE REPORT
10: Percentage - 3.47%
9: Percentage - 2.12%
8: Percentage - 2.37%
7: Percentage - 2.76%
6: Percentage - 2.31%
5: Percentage - 2.37%
4: Percentage - 2.63%
3: Percentage - 3.21%
2: Percentage - 2.5%
1: Percentage - 2.7%

TOTAL CHARACTERS IN ARRAY: 1558

MOST SIGNIFICANT PERCENTAGES
29: Percentage - 3.21%
15: Percentage - 3.59%
11: Percentage - 3.27%
10: Percentage - 3.47%
3: Percentage - 3.21%