0

我需要我的程序循环遍历 while 循环并询问用户无限数量的字符串......直到他们输入“完成”。如果他们埋葬的字符串不是“完成”,那么它会计算整个字符串的哈希码值并将其分类到适当的层中。一旦用户输入完成,程序就会打印每一层的计数,以及哪一层是最大的。

我的问题:程序要求用户输入一个字符串,计算每个字母的哈希值,将这些值分类到一个层中,打印计数,打印哪个层最大。然后向用户询问另一个字符串并继续此过程 ->程序永远不会终止

仅供参考:我已将打印语句(在 for 循环之后)从 while 循环中取出,并且出现编译错误:“无法找到符号”指向我的所有“层”变量。我认为这意味着我需要在 while 循环之外声明它们,但如果我这样做,则会出现同样的问题,因为它们没有在 while 循环内声明。

我需要程序做什么:向用户询问一个字符串,计算哈希码,在适当的地方进行计数(进入适当的层)。继续这个循环,直到用户输入“完成”,然后程序打印每一层中的计数值,最后打印哪一层是最大的。

示例输出:

输入字符串:foo
输入字符串:完成
大于或等于2,000,000,000:0
1,500,000,000至1,999,9999999:0
1,000,000,000至1,499,9999999:0 500,000,000
至999,999999: 0 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);
    }
}   
}
4

2 回答 2

0
于 2013-10-05T16:38:34.750 回答
0

这应该做的工作:

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:");
    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);
        }

    strEntered = sc.next();
} // end of while loop

// Print the tallied totals of each bucket.
}   
}

如果您只需要完成用户输入,则使用 equals 方法本身。

关于移动线路:您最初所做的是使用 strEntered = sc.next(); 获取输入 在while循环之前。检查输入-> 等于完成然后继续。

在 while 循环内:扫描下一个输入后,它被转换为小写 -> 暗示在下一次迭代期间,它不可能在前面带有大写 D 的“完成”。这就是我要求将扫描部分移到 while 循环末尾的原因

于 2013-10-05T04:25:05.443 回答