Dlaczego metoda nie zwraca wartości True?

0

Jak w temacie, metoda sprawdzCzyIstnieje powinna zwracać True po wpisaniu prawidłowego PIN (aaa, bbb, ccc lub ddd). Tymczasem cały czas zwraca false. Będę wdzięczny za pokazanie gdzie zrobiłem błąd w kodzie.
Z góry dzięki :)


public class BazaDanych {

	public static String[][] konta = {{"aaa", "471"}, {"bbb", "8570"}, {"ccc", "12"}, {"ddd", "800"}};
	public  boolean istnieje;
	
	public BazaDanych() {	}
	
	public String getDane(int a, int b) {
		this.konta = konta;
		return konta[a][b];
	}
	
	public void setDane(int a, int b, String wartosc) {
		this.konta = konta;
		konta[a][b] = wartosc;
	}
	
	public boolean sprawdzCzyIstnieje(String wprowadzonyPin2) {
		 for (int i = 0; i==konta.length; i++) {
			if (wprowadzonyPin2.equals(konta[i][0])) {
				istnieje = true;
				break;
			}
			else istnieje = false;
		 }
		 return istnieje;
	}
}

0
for (int i = 0; i==konta.length; i++) {
...
}

To, co tu robisz, to tworzysz zmienną i o wartości 0 i karzesz wykonywać pętlę tak długo, jak długo wartość i jest równa liczbie kont. Na początku jednak liczba kont jest równa 4, a i jest równe 0, więc nie wykonuje się ani razu i zwraca false.

Zapewne zamiast i==konta.length chciałeś napisać i < konta.length.

0

Działa, dziękuję bardzo :)

0

Pętla for będzie się wykonywać tak długo jak podany warunek jest prawdziwy
W twoim przypadku i == kwota.length nigdy nie jest prawdziwy więc pętla nie wykonuje się nawet raz.
Poprawne rozwiązanie to

for (int i = 0; i < konta.length; i++)

Nie zmienia to jednak faktu, że kod jest kompletnie źle napisany. Ta tablica Stringów ma reprezentować jakieś konto bankowe rozumiem? Serio tablica? Nie pomyślałeś o tym by zrobić nowy obiekt np. BankAccount (polskie nazewnictwo klas/metod razi w oczy) i w nim zdefiniować pola jak AccountNumber, PinNumber, CashAmount, itp?

#edit
widzę że kolega wyżej mnie uprzedził, w każdym razie radzę zastanowić się nad tym co napisałem później

0
Emdzej93 napisał(a):

Pętla for będzie się wykonywać tak długo jak podany warunek jest prawdziwy
W twoim przypadku i == kwota.length nigdy nie jest prawdziwy więc pętla nie wykonuje się nawet raz.
Poprawne rozwiązanie to

for (int i = 0; i < konta.length; i++)

Nie zmienia to jednak faktu, że kod jest kompletnie źle napisany. Ta tablica Stringów ma reprezentować jakieś konto bankowe rozumiem? Serio tablica? Nie pomyślałeś o tym by zrobić nowy obiekt np. BankAccount (polskie nazewnictwo klas/metod razi w oczy) i w nim zdefiniować pola jak AccountNumber, PinNumber, CashAmount, itp?

#edit
widzę że kolega wyżej mnie uprzedził, w każdym razie radzę zastanowić się nad tym co napisałem później

@Emdzej93 Dzięki za uwagi. Rzecz w tym, że Javy uczę się dopiero drugi tydzień i obiektowość jest jeszcze dla mnie delikatnie trudna. W tym zadaniu skupiłem się raczej na zrozumieniu jak używać klas i obiektów, a nie na pięknym i efektywnym kodzie. O ile dobrze zrozumiałem, gdybym tworzył obiekty BankAccount, to musiałby być osobny obiekt dla każdego kąta?

0

A nie lepiej byłoby użyć zwyczajnie foreach ? Wtedy w zasadzie "nie da się pomylić" w tego typu sytuacjach.

0
Trzeźwy Kaczor napisał(a):
Emdzej93 napisał(a):

Pętla for będzie się wykonywać tak długo jak podany warunek jest prawdziwy
W twoim przypadku i == kwota.length nigdy nie jest prawdziwy więc pętla nie wykonuje się nawet raz.
Poprawne rozwiązanie to

for (int i = 0; i < konta.length; i++)

Nie zmienia to jednak faktu, że kod jest kompletnie źle napisany. Ta tablica Stringów ma reprezentować jakieś konto bankowe rozumiem? Serio tablica? Nie pomyślałeś o tym by zrobić nowy obiekt np. BankAccount (polskie nazewnictwo klas/metod razi w oczy) i w nim zdefiniować pola jak AccountNumber, PinNumber, CashAmount, itp?

#edit
widzę że kolega wyżej mnie uprzedził, w każdym razie radzę zastanowić się nad tym co napisałem później

@Emdzej93 Dzięki za uwagi. Rzecz w tym, że Javy uczę się dopiero drugi tydzień i obiektowość jest jeszcze dla mnie delikatnie trudna. W tym zadaniu skupiłem się raczej na zrozumieniu jak używać klas i obiektów, a nie na pięknym i efektywnym kodzie. O ile dobrze zrozumiałem, gdybym tworzył obiekty BankAccount, to musiałby być osobny obiekt dla każdego kąta?

Jeżeli chcesz zrozumieć jak używać klasy i obiekty to zdecydowanie radziłbym spróbować podejścia które Ci zaproponowałem.
I tak, dobrze zrozumiałeś, musiałbyś robić osobny obiekt dla każdego konta.

Przykładowo miałbyś taką klasę, możesz ją bez problemu rozbudować o kolejne pole np. balance typu double czy accountNumber typu int.

public class Account {
    private String pin;

    public Account(String pin){
        this.pin = pin;
    }

    public String getPin() {
        return pin;
    }
} 

I zamiast tworzyć tablicę stringów robisz coś takiego

class DataBase {
//tworzysz tablicę przechowującą obiekty klasy Account i na wejściu wrzucasz do tej tablicy 2 nowe obiekty Account o pinie 123 i 321
    private Account[] accounts = {new Account("123"), new Account("321")};

    //zwykła pętla for
    public boolean checkIfExistsv1(String pin){
        for(int i = 0 ; i < accounts.length; i++){
            if(accounts[i].getPin().equals(pin)){
                return true;
            }
        }
        return false;
    }

    //pętla for-each
    public boolean checkIfExistsv2(String pin){
        for(Account account : accounts){
            if(account.getPin().equals(pin)){
                return true;
            }
        }
        return false;
    }
}

Nie potrzebujesz żadnej zmiennej "istnieje", metoda checkIfExists przeiteruje po wszystkich kontach w tablicy i jeżeli znajdzie pasujący pin to zakończy działanie i zwróci true, jeżeli nie znajdzie - po prostu wyjdzie z pętli i zakończy działanie z wynikiem false.

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