【发布时间】:2023-03-24 12:43:01
【问题描述】:
我需要我的程序循环遍历 while 循环并询问用户无限数量的字符串...直到他们输入“完成”。如果他们埋葬的字符串不是“完成”,那么它会计算整个字符串的哈希码值并将其分类到适当的层中。用户输入完成后,程序会打印每一层的计数以及哪一层是最大的。
我的问题:程序要求用户输入一个字符串,计算每个字母的哈希值,将这些值排序到一个层中,打印计数,打印哪个层是最大的。然后向用户询问另一个字符串并继续此过程 -> 程序永远不会终止。
仅供参考:我已将打印语句(在 for 循环之后)从 while 循环中取出,但出现编译错误:“找不到符号”指向我的所有“层”变量。我认为这意味着我需要在 while 循环 outside 声明它们,但如果我这样做了,则会出现同样的问题,因为它们没有在 while 循环 inside 循环中声明。
我需要程序做什么: 向用户询问一个字符串,计算哈希码,在适当的地方进行计数(进入适当的层)。继续这个循环,直到用户输入“完成”,然后程序打印每一层中的计数值,最后打印哪一层是最大的。
示例输出:
输入一个字符串:Foo
输入一个字符串:完成
大于或等于 2,000,000,000: 0
1,500,000,000 至 1,999,999,999:0
1,000,000,000 至 1,499,999,999:0
500,000,000 至 999,999,999:0
小于等于499,999,999:1
最大桶小于等于499,999,999,大小为1
**另外,我知道有一种更简单的方法可以确定哪一层最大(第 64-109 行),但我无法弄清楚。我们在课堂上没有讨论过数组或类似的东西,所以我不确定如何使用 if/else 语句来简化所有这些。**
import java.util.Scanner;
public class StringHashCodeLoop {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String strEntered;
// Prompt user for a string, store string in "strEntered."
System.out.println("Enter a String:");
strEntered = sc.next();
// Perform a while loop as long as the entered string does not equal "Done."
while (!strEntered.equals("Done")) {
// Convert all letters in the string to lower case.
strEntered = strEntered.toLowerCase();
// Declare the integer "length" and set it equal to the length of the entered string, to be used in the for loop.
int length = strEntered.length();
// Initialize each tier/bucket value to 0 before performing calculations.
int tier1,tier2,tier3,tier4,tier5;
tier1 = 0;
tier2 = 0;
tier3 = 0;
tier4 = 0;
tier5 = 0;
for(int i = 0; i < length; ++i) {
int hashValue = 0;
hashValue += strEntered.charAt(i) * Math.pow(31, length - 1 - i);
// Sort the Hash Code for the entered string into its corresponding bucket.
if (hashValue >= 2000000000) {
tier1++;
}
else if ((1500000000 < hashValue) && (hashValue < 1999999999)) {
tier2++;
}
else if ((1000000000 < hashValue) && (hashValue < 1499999999)) {
tier3++;
}
else if ((500000000 < hashValue) && (hashValue < 999999999)) {
tier4++;
}
else {
tier5++;
}
} // end of for loop
System.out.println("Enter a String:");
strEntered = sc.next();
} // end of while loop
// Print the tallied totals of each bucket.
System.out.println("Greater than 2,000,000,000: " + tier1);
System.out.println("1,500,000,000 to 1,999,999,999: " + tier2);
System.out.println("1,000,000,000 to 1,499,999,999: " + tier3);
System.out.println("500,000,000 to 999,999,999: " + tier4);
System.out.println("Less than or equal to 499,999,999: " + tier5);
// Print which is the largest bucket and the total of its contents.
if (tier1 > tier2 && tier1 > tier3 && tier1 > tier4 && tier1 > tier5) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier1);
}
else if (tier2 > tier1 && tier2 > tier3 && tier2 > tier4 && tier2 > tier5) {
System.out.println("The largest bucket is 1,500,000,000 to 1,999,999,999 with a size of " + tier2);
}
else if (tier3 > tier1 && tier3 > tier2 && tier3 > tier4 && tier3 > tier5) {
System.out.println("The largest bucket is 1,000,000,000 to 1,499,999,999 with a size of " + tier3);
}
else if (tier4 > tier1 && tier4 > tier2 && tier4 > tier3 && tier4 > tier5) {
System.out.println("The largest bucket is 500,000,000 to 999,999,999 with a size of " + tier4);
}
else if (tier5 > tier1 && tier5 > tier2 && tier5 > tier3 && tier5 > tier4) {
System.out.println("The largest bucket is Less than or equal to 499,999,999 with a size of " + tier5);
}
else if (tier1 == tier2) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier1);
}
else if (tier1 == tier3) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier1);
}
else if (tier1 == tier4) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier1);
}
else if (tier1 == tier5) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier1);
}
else if (tier2 == tier3) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier2);
}
else if (tier2 == tier4) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier2);
}
else if (tier2 == tier5) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier2);
}
else if (tier3 == tier4) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier3);
}
else if (tier3 == tier5) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier3);
}
else if (tier4 == tier5) {
System.out.println("The largest bucket is Greater than 2,000,000,000 with a size of " + tier4);
}
}
}
【问题讨论】:
-
在while循环中移动第二行-> strEntered = sc.next();在while循环结束之前:即在}之前//while循环行结束,事情应该没问题
-
顺便说一句,当您检查用户输入 Done 时,使用 equalsIgnorCase 而不是 equals。之前您使用 toLowerCase 将字符串从 Done 转换为 done,然后将其与 Done 进行比较。导致你的问题
-
@balajikrishnan 我更改了代码以解决您的第一条评论。我不知道你为什么建议我将第一个“输入字符串”提示放在循环中 - 如果用户尚未输入字符串,循环将如何检查字符串是否不等于“完成”?另外,我的作业说->“完成”一词(区分大小写)不应计入范围,并且区分大小写。尽管如此,您不应停止或忽略单词的变体,例如“dONE”、“DoNE”、“done”
-
@balajikrishnan ** 使用 equalsIgnoreCase 不会忽略这些变体并将它们计为字符串,而不是 while 循环的停用词吗?
标签: java for-loop while-loop hashcode