停留在for循环中第一个元素的百分比计算
Percentage calculation staying at first element in for loop
编辑:添加代码以显示频率计数
这不是作业。我这样做是为了好玩。
我希望这一小段代码就足够了,但我 运行 遇到了一个奇怪的问题。我计算了数组中每个数字的频率,效果很好。嗯,我想看看这些频率的 百分比 ,所以我创建了一个小方法来计算它。
由于第一个元素的频率是 42,而我的字符总数是 1,553,所以它为 每个 元素打印 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;
}
除百分比计数器外一切正常,因此我将其他代码排除在外。
这是频率输出的一部分:
10: Frequency - 54
9: Frequency - 33
8: Frequency - 37
7: Frequency - 42
6: Frequency - 35
5: Frequency - 36
4: Frequency - 40
3: Frequency - 50
2: Frequency - 39
1: Frequency - 42 //<---IT'S STUCK HERE...????
TOTAL CHARACTERS IN ARRAY: 1553
这是相同元素及其(不正确)百分比的输出:
10 Percentage: 2.7%
9 Percentage: 2.7%
8 Percentage: 2.7%
7 Percentage: 2.7%
6 Percentage: 2.7%
5 Percentage: 2.7%
4 Percentage: 2.7%
3 Percentage: 2.7%
2 Percentage: 2.7%
1 Percentage: 2.7%
您在打印循环中传递给 getPercentage 的计数变量在循环期间的任何阶段都不会更新。
您需要为打印百分比的 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) + "%");
}
基本上你需要计数和计数来计算百分比。每行的计数和计数都不同,因此需要将两者都存储在您的集合中。
编辑 添加代码以显示最常出现的情况
好吧,我睡了,今天早上再试一次。我设置了断点以查看发生了什么,计数器停留在第一个元素,在这种情况下是整数 39,出现次数为 42 次。每个百分比都显示为 42 / 1558 的百分比(不包括空格的所有字符的总数)。
由于百分比与计数基本相同,只是除以计数,我完全摆脱了百分比方法,再次遍历元素,并确保 reset 之前的计数器进入第二个循环。这是更改后的代码(仅包括 count 和 tally 方法。另一个方法是 getFileInfo(),它只是从文本文件中获取数字并将它们放入数组中):
public static void getCount(ArrayList<Integer> 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();
count = 0;
System.out.println("PERCENTAGE REPORT");
for(Integer n : set) {
tally = 0; //<---Tally was being calculated twice. Had to reset.
countNonSpaces(array); //get the tally once more after resetting
count = table.get(n);
double percentage = (count*100.0)/tally; //percentage is essentially "count" with an additional calculation so no new method needed
percentage = percentage * 100;
percentage = Math.round(percentage);
percentage = percentage/100;
System.out.println(n + ": Percentage - " + percentage + "%");
}
System.out.println();
System.out.println("MOST SIGNIFICANT PERCENTAGES");
count = 0;
for(Integer n : set) {
tally = 0;
countNonSpaces(array);
count = table.get(n);
percentage = (count*100.0)/tally;
percentage = percentage * 100;
percentage = Math.round(percentage);
percentage = percentage/100;
// Picked a decent number (50), copied the code
// from the frequency calculation, and added
// a continue statement to only print the most frequent #'s.
if(count < 50) {
continue;
}
System.out.println(n + ": Percentage - " + percentage + "%");
}
}
public static int countNonSpaces(ArrayList<Integer> array) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) != ' ') {
tally++;
}
}
return tally;
}
}
为简洁起见,我不会显示每个整数,但这是新的(和正确的)输出:
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%
感谢您帮助我转动齿轮。非常感谢。 :-)
编辑:添加代码以显示频率计数
这不是作业。我这样做是为了好玩。
我希望这一小段代码就足够了,但我 运行 遇到了一个奇怪的问题。我计算了数组中每个数字的频率,效果很好。嗯,我想看看这些频率的 百分比 ,所以我创建了一个小方法来计算它。
由于第一个元素的频率是 42,而我的字符总数是 1,553,所以它为 每个 元素打印 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;
}
除百分比计数器外一切正常,因此我将其他代码排除在外。
这是频率输出的一部分:
10: Frequency - 54
9: Frequency - 33
8: Frequency - 37
7: Frequency - 42
6: Frequency - 35
5: Frequency - 36
4: Frequency - 40
3: Frequency - 50
2: Frequency - 39
1: Frequency - 42 //<---IT'S STUCK HERE...????
TOTAL CHARACTERS IN ARRAY: 1553
这是相同元素及其(不正确)百分比的输出:
10 Percentage: 2.7%
9 Percentage: 2.7%
8 Percentage: 2.7%
7 Percentage: 2.7%
6 Percentage: 2.7%
5 Percentage: 2.7%
4 Percentage: 2.7%
3 Percentage: 2.7%
2 Percentage: 2.7%
1 Percentage: 2.7%
您在打印循环中传递给 getPercentage 的计数变量在循环期间的任何阶段都不会更新。
您需要为打印百分比的 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) + "%");
}
基本上你需要计数和计数来计算百分比。每行的计数和计数都不同,因此需要将两者都存储在您的集合中。
编辑 添加代码以显示最常出现的情况
好吧,我睡了,今天早上再试一次。我设置了断点以查看发生了什么,计数器停留在第一个元素,在这种情况下是整数 39,出现次数为 42 次。每个百分比都显示为 42 / 1558 的百分比(不包括空格的所有字符的总数)。 由于百分比与计数基本相同,只是除以计数,我完全摆脱了百分比方法,再次遍历元素,并确保 reset 之前的计数器进入第二个循环。这是更改后的代码(仅包括 count 和 tally 方法。另一个方法是 getFileInfo(),它只是从文本文件中获取数字并将它们放入数组中):
public static void getCount(ArrayList<Integer> 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();
count = 0;
System.out.println("PERCENTAGE REPORT");
for(Integer n : set) {
tally = 0; //<---Tally was being calculated twice. Had to reset.
countNonSpaces(array); //get the tally once more after resetting
count = table.get(n);
double percentage = (count*100.0)/tally; //percentage is essentially "count" with an additional calculation so no new method needed
percentage = percentage * 100;
percentage = Math.round(percentage);
percentage = percentage/100;
System.out.println(n + ": Percentage - " + percentage + "%");
}
System.out.println();
System.out.println("MOST SIGNIFICANT PERCENTAGES");
count = 0;
for(Integer n : set) {
tally = 0;
countNonSpaces(array);
count = table.get(n);
percentage = (count*100.0)/tally;
percentage = percentage * 100;
percentage = Math.round(percentage);
percentage = percentage/100;
// Picked a decent number (50), copied the code
// from the frequency calculation, and added
// a continue statement to only print the most frequent #'s.
if(count < 50) {
continue;
}
System.out.println(n + ": Percentage - " + percentage + "%");
}
}
public static int countNonSpaces(ArrayList<Integer> array) {
for (int i = 0; i < array.size(); i++) {
if (array.get(i) != ' ') {
tally++;
}
}
return tally;
}
}
为简洁起见,我不会显示每个整数,但这是新的(和正确的)输出:
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%
感谢您帮助我转动齿轮。非常感谢。 :-)