0

while ループをループし、ユーザーが「完了」と入力するまで、無限の数の文字列を要求するプログラムが必要です。インターレッドされた文字列が「完了」していない場合、文字列全体のハッシュ コード値を計算し、適切な層に並べ替えます。ユーザー入力が完了すると、プログラムは各層の集計と、どの層が最大かを出力します。

私の問題:プログラムはユーザーに文字列を要求し、各文字のハッシュ値を計算し、それらの値を層に並べ替え、集計を出力し、どの層が最大かを出力します。次に、ユーザーに別の文字列を要求し、このプロセスを続行します ->プログラムは決して終了しません。

参考までに、(for ループの後の) 印刷ステートメントを while ループから取り出したところ、コンパイル エラーが発生しました: 「層」変数のすべてを指す「シンボルが見つかりません」。これは、whileループの外で宣言する必要があることを意味すると思いますが、そうすると、whileループで宣言されていないため、同じ問題が発生します。

プログラムで実行する必要があること:ユーザーに文字列を要求し、ハッシュ コードを計算し、必要に応じて (適切な層に) 集計します。ユーザーが「完了」と入力するまでこのサイクルを続けます。プログラムは各層の集計値を出力し、最後にどの層が最大かを出力します。

出力例:

文字列を入力します:foo文字列を
入力:
2,000,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,99999:1等であるか、または等しいバッケッツに
等しいサイズ 1 で 499,999,999

**また、どの階層が最大かを判断する簡単な方法があることは知っていますが (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

これは仕事をするはずです:

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 ループの前。入力を確認 -> Done に等しく、次に進みます。

whileループ内:次の入力をスキャンした後、小文字に変換されました->次の反復中に、大文字のDを前に付けて「完了」することはできないことを意味します。それが、スキャン部分をwhileループの最後に移動するように依頼した理由です

于 2013-10-05T04:25:05.443 に答える
0
于 2013-10-05T16:38:34.750 に答える