Skocz do zawartości

Problem z pętlą do-while


grizzly

Recommended Posts

Witam

Mam mały problem z zamknięciem pętli. Otóż napisałem sobie programik - mini kalkulator i nie udaje mi się zrobić tak, żeby użytkownik sam zadecydował czy chce zakończyć działanie programu, czy nie.

package scanner;
import java.util.Scanner;

public class Application {

public static void main(String[] args) {
    boolean stop;
    do {
    stop = false;

// Tutaj mam cały kod, który działa poprawnie no i teraz chcę zamknąć pętlę.

    }
    Scanner scanner = new Scanner(System.in);
    System.out.println("Chcesz kontynuować? (T/N):");
    String text = scanner.nextLine();

    if (text == "T")
        stop = true;
    }
    while (stop == true);
}

}

Bez względu na to czy wpiszę T czy N, program kończy działanie. Jak to naprawić?

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Java ma typy proste(int, float itp) oraz typy obiektowe(Integer, Float itd) Dla typów prostych porównujesz wartości zmiennych czyli używasz ==, != Natomiast dla typów obiektowych porównywanie działa na zasadzie referencji i da się ją sprawdzić przez equials().

int i = 5;
        int j = 5;
        System.out.println(i == j); // true

        Integer ii = new Integer(6);
        Integer jj = new Integer(6);
        System.out.println(ii == jj); // false
        System.out.println(ii.equals(jj)); // true

        String str1 = "Ala ma kota";
        String str2 = "Ala ma kota";
        System.out.println(str1 == str2); // true
        System.out.println(str1.equals(str2)); //true

        String str3 = new String("Ala ma kota");
        String str4 = new String("Ala ma kota");
        System.out.println(str3 == str4); //false
        System.out.println(str3.equals(str4)); //true
Link do komentarza
Udostępnij na innych stronach

Tak jak napisał bartek i environ, == porównuje same adresy, z kolei equals() porównuje treść. Należałoby jednak dodać, że wszyskie stałe o typie String użyte w programie (więc, w twoim przypadku -- stringi takie jak "T" lub "Chcesz kontynuować? (T/N):") są dodawane do wewnętrznej puli stringów maszyny wirtualnej jeszcze przed rozpoczęciem działania programu. Użycie metody intern() na typie String wymusza odszukanie wybranego ciągu znaków w tej puli i zwrócenie referencji do tego konkretnego wpisu w puli stringów, jeśli ten string w puli istnieje. Jeśli nie istnieje, jest do niej dodawany i zwrócona zostanie referencja do (już istniejącego) nowego wpisu w puli stringów.

Jak zostało wspomniane wcześniej, stosując porównanie a == b, zakładając że a i b są zmiennymi o typie String, porównywane są ze sobą dwie referencje. Gdy przynajmniej jedna z nich jest dynamicznie alokowana, nie jest możliwe określenie równości treści danych znajdujących się w tych zmiennych (za pomocą operatora ==). Jednak wymuszając dodanie treści tych zmiennych do puli stringów za pomocą .intern() -- if(a.intern() == b.intern()), porównywane są ze sobą referencje obiektów puli stringów. Biorąc pod uwagę charakter działania metody intern() i to, że wymusza ona istnienie tylko jednego obiektu w puli o danej treści, w sytuacji, gdy a i b zawierają te same dane, metody intern() będą wskazywać na ten sam obiekt w puli stringów, spełniając zadanie porównania treści zmiennych :)

Dlatego też kod:

if(text.intern() == "T".intern()) {
    stop = true;
}

też powinien spełniać swoje zadanie (mimo, że oczywiście lepiej używać equals()).

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...