Простая, если постановка задачи - PullRequest
4 голосов
/ 01 декабря 2010

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

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

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

  }
}

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

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

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

Ответы [ 10 ]

9 голосов
/ 01 декабря 2010

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

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

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

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

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

6 голосов
/ 01 декабря 2010

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

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() вернет ноль, и хотите взорвать, если вы получите такие плохие данные, вместо того, чтобы продолжать и возможно распространение проблемы).

3 голосов
/ 01 декабря 2010

В 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";
3 голосов
/ 01 декабря 2010

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

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

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

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

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 соответствует ссылке , равной
2 голосов
/ 01 декабря 2010

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

1 голос
/ 01 декабря 2010

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

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

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

1 голос
/ 01 декабря 2010

Попробуйте

public void printoutsailings() {
    for (Sailing s:sailings) {
        String hamburg = "Hamburg";
        if (s.getDeparturePort().equals(hamburg)) {
            System.out.println(s.toStringAdjusted());
        }
    }
}
0 голосов
/ 01 декабря 2010

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

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

0 голосов
/ 01 декабря 2010

попробуй if (s.getDeparturePort().equals(hamburg))

0 голосов
/ 01 декабря 2010

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

...