Простая, если постановка задачи

Я пытаюсь вернуть toString, если что-то верно.

У меня есть этот код:

    public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = ("Hamburg");
        if ((s.getDeparturePort()) == hamburg) {
            System.out.println(s.toStringAdjusted());
        }

  }
}

Однако я ничего не получаю, когда запускаю метод (когда должен что-то получать). Я предполагаю, что я каким-то образом испортил логику или не понял =,== и eq правильно, я не слишком уверен.

В toString или цикле for нет ничего плохого, и я не получаю никаких ошибок компилятора или времени выполнения. Просто логика неверна.

Если бы кто-то мог исправить меня, это было бы оценено. Благодарю.

10 ответов

Решение

Вы должны использовать .equals() вместо == Проверять String равенство. Попробуйте следующее:

if ((s.getDeparturePort()).equals(hamburg)) {
    System.out.println(s.toStringAdjusted());
}

Короче, == проверяет, являются ли две строки одной и той же ссылкой, и .equals() проверяет, выглядят ли две строки одинаково

Следует также сказать, что вам нужно использовать .equals() для проверки равенства любого Object типа, а не только строки. Только примитивные типы (int, double, char) следует использовать == для равенства.

Чтобы компенсировать тот факт, что вылет может быть нулевым, просто измените условие. Было бы читать - hamburg.equals(s.getDeparturePort())

Да, вы полагаетесь на == сравнение на равенство, а не идентичность. Измените код на:

if (s.getDeparturePort().equals("hamburg")) {
    System.out.println(s.toStringAdjusted());
}

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

Вы хотите проверить, равны ли две строки, а именно - содержат ли они одинаковую последовательность символов. Вот что переопределено equals метод для.

(Чтобы продемонстрировать это на практике, каждое утро я сажусь на автобус № 36. Для меня эти автобусы равны, потому что они едут по тому же маршруту, но я знаю, что есть несколько автобусов № 36 - я не получаю на том же физическом автобусе каждый день.)

Обратите внимание, что приведенный выше код NullPointerException если s.getDeparturePort() возвращается null, Есть два способа избежать этого. Во-первых, вы можете использовать ссылку, известную как не равную нулю, в качестве цели вызова метода:

if ("hamburg".equals(s.getDeparturePort()))

Кроме того, вы можете выполнить явную проверку недействительности:

String port = s.getDeparturePort();
if (port != null && port.equals("hamburg"))

Или вы можете оставить это, чтобы вызвать исключение, если это наиболее подходящее поведение (т.е. если вы действительно не ожидаете getDeparturePort() вернуть ноль, и хотите взорвать, если вы получаете такие плохие данные, а не продолжать и, возможно, распространения проблемы).

В String равенство проверяется либо equals() метод или compareTo() метод.

Ваше решение может быть исправлено:

if (s.getDeparturePort().equals(hamburg)) {
    System.out.println(s.toStringAdjusted());
}

Чтобы избежать получения null от s.getDeparturePort()Я бы сделал следующее.

if ("Hamburg".equals(s.getDeparturePort())) {
    System.out.println(s.toStringAdjusted());
}

Это чтобы избежать NullPointerException если s.getDeparturePort() является null (из вашего примера кода).

Кроме того, вы можете использовать compareTo() метод вроде так....

Ваш измененный код (для использования compareTo():

if (s.getDeparturePort().compareTo(hamburg) == 0) {
    System.out.println(s.toStringAdjusted());
}

Мое альтернативное решение (используя compareTo())

if ("Hamburg".compareTo(s.getDeparturePort()) == 0) { //Zero means that it is equal.
    System.out.println(s.toStringAdjusted());
}

Btw...

String hamburg = ("Hamburg");

может быть легко написано как

String hamburg = "Hamburg";

Вы должны сравнить строки, используя equals метод.

В Java String является ссылочным типом Это означает, что ваш String hamburg, указывающая на переменную в стеке, содержит ссылку на управляемый объект кучи, фактически содержащий строку. Напротив, тип значения полностью выделяется в стеке.

==, чтение ссылки равно сравнивает значения стека. Вместо этого все классы реализуют equals метод сравнения значений Он сравнивает реальные значения объекта, где бы они ни находились.

Следующий код работает для вас:

public void printoutsailings() { 
    for (Sailing s:sailings) { 
        String hamburg = ("Hamburg"); 
        if (hamburg.equals(s.getDeparturePort())) { //First hamburg to prevent any possible NullPointerException
            System.out.println(s.toStringAdjusted()); 
        } 

  } 
} 

Просто для вашего любопытства:

  1. PHP сравнивает только по значению
  2. C# переопределяет == оператор как значение равно оператору, но только для string учебный класс
  3. В VB.NET по умолчанию = оператор - это значение равно оператору. Is Оператор соответствует ссылочной равно

if(hamburg.equals(s.getDeparturePort()))

== сравнивает сам объект, вам лучше использовать .equals() так как он будет сравнивать фактическое значение строки, например:

if ((s.equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }

Также убедитесь, что Sailings имеет по крайней мере 1 значение, иначе вы никогда не введете его в цикл

Пытаться

public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = "Hamburg";
        if (s.getDeparturePort().equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }
    }
}

Вместо того, чтобы просто предоставить код... проверьте это, я почти уверен, что он доставит вас туда, куда вам нужно идти...

Пытаться if (s.getDeparturePort().equals(hamburg))

Вместо использования == для объектов String (или любых объектов), используйте.compareTo(), как в этом примере:

http://leepoint.net/notes-java/data/strings/12stringcomparison.html

Другие вопросы по тегам