Porównanie String == Int

0

Witam.
Jestem świeżakiem. Uczę się JAVY od kilku dni.
Korzystam z wielu pomocy znalezionych na YT lub stronach z kursami.
Natomiast pasuje mi Mirosław Zelent i jego tłumaczenie, między innymi tu: https://miroslawzelent.pl/kurs-c++/instrukcja-warunkowa-if/

W tym odcinku opisuje on, instrukcję warunkową "if" i pokazuje to między innymi na przykładzie "Podania kodu PIN do bankomatu".
Z racji tego, że C++ i Java są podobne, to na podstawie tego tutoriala napisałem ten programik w JAVA.

Podając kod PIN, zaczynający się od 0 (zera), zmienna int nie widzi tego zera, stąd używamy String'a.
Mój problem polega na tym, że podając PIN, on zawsze jest zły, nawet jak podam '0999'.
Domyślam się, że deklaracja String PIN ="0999" jest różna od deklaracji String podajPIN, ale nie wiem jak zrobić, aby to działało.
Proszę o pomoc.

import java.util.Scanner;

public class Moje {
public static void main(String[] args) {

    String podajPIN;
    String PIN = "0999";

    System.out.println("Podaj PIN");
    podajPIN = getString();


    if (podajPIN == PIN) {
        System.out.println("Podałeś dobry PIN");
    } else {
        System.out.println("Podany PIN jest nieprawidłowy");
    }



}

public static String getString() { return new Scanner(System.in).nextLine();}

}

5

https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        String podajPIN;
        String PIN = "0999";
        System.out.println("Podaj PIN");
        podajPIN = getString();
        if (podajPIN.equals(PIN)) {
            System.out.println("Podałeś dobry PIN");
        } else {
            System.out.println("Podany PIN jest nieprawidłowy");
        }
    }

    public static String getString() {
        return new Scanner(System.in).nextLine();
    }
}

screenshot-20210522192223.png

2

W Java oraz C# mamy typy wartościowe (int, struct, etc.. ) oraz referencyjne (klasy). String jest typem referencyjnym ponieważ na stosie program nie przechowuje wartości Stinga tylko jego adres (wskaźnik) na tzw. stercie (ang. heap). Generalnie jest tak, że wszystkie objekty przechowywane są na stercie. Operatora == możesz używać dla typów wartościowych ale przy typach referencyjnych pojawia się problem bo wtedy operator == porównuję wartości referencji (wskaźnik) a nie zawartość objektów. W niektórych językach np. C#, C++ operator == został specjalnie dostosowany do porównywania wartości typu String i w tym przypadku twój kod działałby poprawnie.
Nie rozumiem dlaczego uczysz się Javy z kursu C++.
Poczytaj sobie na temat sterty bo to bardzo ważne pojęcie w programowaniu.

PS.
Algol68 (PL/1) był pierwszym językiem, który dopuszczał takie deklaracje:
int x;
ref int x = heap int;
heap int x;
Odpowiednikiem heap w C jest funkcja 'malloc' a w C++/Java operator 'new'.

1

Jeszcze trochę na temat Javy:
String imie; //zmienna imie przechowywana jest na stosie.
String imie = "pawel"; //kompilator Javy przekształca to na wyrażenie:
String imie = new String("pawel"); //zmienna imie jest na stosie i przechowuję adres słowa "pawel" które przechowywane jest na stercie.
Java automatycznie czyści niepotrzebne objekty ze sterty a w C++ trzeba to robić ręcznie. Pierwszym językiem, który automatycznie oczyszczał stertę z niepotrzebnych objektów był Lisp (1958).

1

@AnyKtokolwiek: Dlaczego Java z Zelenta? :) Nie wiem. Jak wspomniałem, dopiero zacząłem i sam jestem sobie sterem. Wybrałem na szybko Javę, bo chciałbym kiedyś napisać apkę na Androida. Tłumaczenie Zelenta do mnie trafia. Jak możesz mnie pokierować na inne tory, to super, ale... Java poszła w odstawkę i zastąpił ją Kotlin. Nie uwierzysz, ale też słucham Zelenta ;D. Ściągnąłem sobie kurs a Udemy - średni był. Czytam różne strony, oglądam kursy - powoli idzie do przodu. Najbardziej interesują mnie filmiki, gdzie jest fajnie wytłumaczone zagadnienie i są zadania - Zelent to ma. Oczywiście łatwiej mi było przełożyć C++ na Javę, niż na Kotlina, ale to powoduje, że szukam sam sposobów na te zadania. I w sumie mam pierwszy problem. Zaraz wstawię post, ale to nie tu. Pozdrawiam :)

0

Zamów sobie jakiś kurs na Udemy, najlepiej jakieś topowe. Oczywiście po angielsku. Będzie Pan zadowolony.
Często takie kursy mają zamknięte grupy na discordzie gdzie możecie się wymieniać spostrzeżeniami.
Ewidentnie brak ci podstaw, zrozumienia jak to działa. W takich kursach wszystko jest po kolei wytłumaczone.

0

To zadanie można rozwiązać na kilka sposobów:

  1. przy pomocy intern()
	public static String getString() { 
		return new Scanner(System.in).nextLine().intern();
	}

https://ideone.com/A5k2V4

  1. przy pomocy hashCode()
	    int podajPIN;
	    int PIN = "0999".hashCode();
	    //...

	public static int getString() { 
		return new Scanner(System.in).nextLine().hashCode();
	}

https://ideone.com/cp9fo2

  1. przy pomocy findInLine()
	podajPIN = getString(PIN);
	//...

	public static String getString(String pattern) { 
		String found = new Scanner(System.in).findInLine("^"+pattern+"$");
		return pattern.equals(found) ? pattern : null; 
	}

https://ideone.com/QxYCkS

Rozwiązania te podaję w celach rozrywkowych, najlepszy sposób już został podany (porównanie przez equals).

1 użytkowników online, w tym zalogowanych: 0, gości: 1