Строковая проблема - Java - PullRequest
0 голосов
/ 18 июля 2011

Я пишу программу для класса, в которой я анализирую различные введенные коды продуктов.Это довольно просто, но у меня проблема.Я пытаюсь завершить цикл, если пользователь вводит «E» или «E».Тем не менее, это не завершает цикл вообще.Это в конце оператора while, поэтому установка цикла в false должна завершать его, и он даже не выводит итоговые значения, поэтому я что-то напутал.Код - это строковый тип.

        // Prompt the user for another company code or exit
        System.out.print("Enter the company code or type 'e' to exit: ");

        // Input the user's company code
        code = scan.nextLine();

        // Check to see if the user wants to exit
        if (code == "e" || code == "E") {
            // Output final statistics
            System.out.print("Total valid codes: " + valid + "/n");
            System.out.print("Total banned codes: " + banned);

            // End the loop     
            loop = false;
        }

Есть идеи?Спасибо!

Ответы [ 11 ]

6 голосов
/ 18 июля 2011

Вам нужно использовать code.equals("e") || code.equals("E") (или просто code.equalsIgnoreCase("e")). Это потому, что == сравнивает идентичность ("являются ли x и y одним и тем же объектом?"), Тогда как equals имеет значение сравнение ("у х и у одинаковое значение?").

4 голосов
/ 18 июля 2011

При сравнении Strings вы должны всегда использовать метод equals вместо ==, поэтому

if ("e".equals(code) || "E".equals(code))

, вероятно, то, что вы хотите.

Причина этого в том, что Strings являются специальными объектами в Java.Они являются неизменяемыми и могут быть интернированными для оптимизации использования памяти.Константы (например, "e" и "E" в вашем коде) автоматически интернируются компилятором, но метод scanLine, вероятно, вернет неинтернизированную строку, поэтому сравнение == завершится неудачей.

Помните, что когда мы говорим об объектах, == проверяет равенство ссылок не равенство значений , то есть a == b означает "do a и b относятся ктот же объект? "a.equals(b) может быть истинным, но a == b ложным.

2 голосов
/ 18 июля 2011

Использование equalsIgnoreCase ()

Ваш код будет

if (code.equalsIgnoreCase("e")) {
            // Output final statistics
            System.out.print("Total valid codes: " + valid + "/n");
            System.out.print("Total banned codes: " + banned);

            // End the loop     
            loop = false;
        }
1 голос
/ 18 июля 2011

Попробуйте это:

** LOOP * {

    // Prompt the user for another company code or exit
    System.out.print("Enter the company code or type 'e' to exit: ");

    // Input the user's company code
    code = scan.nextLine();

    // Check to see if the user wants to exit
    if (code.equals("e") || code.equals("E")) {  // <====== see new code
        // Output final statistics
        System.out.print("Total valid codes: " + valid + "/n");
        System.out.print("Total banned codes: " + banned);

        // End the loop     
        //loop = false;
        break;  // <====== see new code
    }

}

1 голос
/ 18 июля 2011

Использование .equalsIgnoreCase("e"), == сравнивает адреса объектов в памяти, а .equals(String) чувствительно к регистру.

1 голос
/ 18 июля 2011

Используйте .equals при сравнении строк.

В вашем случае вы даже можете использовать

if (code.equalsIgnoreCase("e")) {

Причина в том, что == проверяет, являются ли два объекта одним и тем же объектом. Вы можете иметь два разных строковых объекта, представляющих одну и ту же строку.

1 голос
/ 18 июля 2011

Строки сравниваются через equals, а не ==

if (code.equals("e") || code.equals("E")) {
1 голос
/ 18 июля 2011

Сравните строки, используя .equals(), а не ==

0 голосов
/ 01 апреля 2015

Используя объяснение, данное в https://stackoverflow.com/a/513839/1394464

== tests for reference equality.

.equals() tests for value equality.

Поэтому, если вы действительно хотите проверить, имеют ли две строки одинаковое значение, вы должны использовать .equals () вместо ==.

So

if(code == "e" || code == "E")

должно стать

if(code.equals("e") || code.equals("E"))
0 голосов
/ 01 июля 2014

Лучше использовать

code.equalsIgnoreCase("e")
...