Pobieranie wartości z HashMap

Pobieranie wartości z HashMap
A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Witam, chciałam żeby klucz oraz jego wartość wypisywały mi się w polu tekstowym więc utworzyłam metodę:

Kopiuj
    public String listaKsiazek(){
        
        if(ksiazki.isEmpty()){
        return lista = "Nie ma książek w bazie";
        }else {
       for (Map.Entry<String, Ksiazka> ksiazkiEntry : ksiazki.entrySet()) {
            final String IDksiazki = ksiazkiEntry.getKey();
            final Ksiazka ksiazka = ksiazkiEntry.getValue();
            String ks = ksiazka.pobierzCalosc();
            System.out.println("Key: " + IDksiazki + ", Value: " + ksiazka);
            lista = ks + "\n" + lista;

            System.out.println(lista);        
                }return lista;   
        }
}

Wszystko działa i zwracane są obiekty z mapy, ale zawsze na końcu pojawia się null. Jak zrobić żeby pojawiały się tylko elementy z mapy bez tej wartości null?

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
0

Co to znaczy, że na końcu pojawia sie null? Końcu czego? Metody? Każdej iteracji foreacha?

Kilka uwag:

  1. Jeśli chcesz tworzyć Stringa składającego się z kilku innych stringów, nie używaj + tylko StringBuffer.
  2. Dlaczego chcesz drukować całą mapę jako jedno pole tekstowe?
Belka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: PL
  • Postów: 452
0

Pomyśl nad przesłonięciem metody toString() w książce. Możesz ją wygenerować nawet z pomocą IDE i w pętli wypisywać książki nawet

Kopiuj
System.out.println(ksiazka)

Nie widzę sensu wypisywania po książce tej dziwnej zmiennej lista

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Null pojawia się w konsoli po wypisaniu obiektów z mapy np wygląda to tak:

Kopiuj
Ksiazka{idKsiazki=id, tytul=tytul, autor=autor, opis=opis, stan=Dostępna}
null

Przesłonięcie metody toString() w klasie Ksiazka nie pomogło, dalej pojawia się na końcu wartość null.
A potrzebne jest mi to, ponieważ w tej aplikacji stworzyłam okienko gdzie wyświetlają się wszystkie elementy zapisane w bazie danych - tutaj jej rolę pełni mapa.

Belka
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: PL
  • Postów: 452
0

Zakomentuj to System.out.println(lista) i sprawdź. null nie powinien się już pokazywać.

Przesłanianie metody toString to z mojej strony wskazówka i po prostu wygodna sprawa do wypisywania sobie informacji o obiekcie.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Zakomentowałam i w konsoli się nie wypisuje już null, ale problem pojawia się ponieważ w polu tekstowym się wyświetla. A jak zrobię return w pętli to mi przerwie po 1 iteracji. Głównie chodzi mi o to wypisywanie w return ponieważ wywołuję tą metodę w innej klasie i wypisuje się w polu tekstowym.

A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0

Wie ktoś jak zrobić żeby mapa w return zwracała tylko wartości z mapy? Iteruje ją tak jak w kodzie powyżej ale zawsze zwraca mi dodatkowo wartość null po wypisaniu wszystkich wartości z mapy. Może jakiś warunek z if````? Jeśli tak to gdzie? Bo ja już nie mam pojęcia, w System.out.println("Key: " + IDksiazki + ", Value: " + ksiazka);zwraca wszystko tak jak powinno a wreturn lista; ``` zawsze jest jeszcze ten dodatkowy null. Ma ktoś jeszcze jakąś propozycję co zrobić?

Delor
  • Rejestracja: dni
  • Ostatnio: dni
0

lista = ks + "\n" + lista;
To co było w lista wypiszesz na końcu.
Czym jest lista i jaką ma wartość przed wejściem do tej metody?
Może wystarczy na początku dać

Kopiuj
lista = "";
A1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 14
0
Kopiuj
public class BibliotekaUsluga {

   Map<String, Ksiazka> ksiazki;
   Map<String, Klient> klienci;
   Map<String, Ksiazka> listaKsiazek;
   String lista;
public BibliotekaUsluga() {
        this.ksiazki = new HashMap<>();
        this.klienci = new HashMap<>();
        this.listaKsiazek = new HashMap<>();


    }

    public String listaKsiazek(){
     
        if(ksiazki.isEmpty()){
        return lista = "Nie ma książek w bazie";
        }else {
            for (Map.Entry<String, Ksiazka> ksiazkiEntry : ksiazki.entrySet()) {
                String IDksiazki = ksiazkiEntry.getKey();
                Ksiazka ksiazka = ksiazkiEntry.getValue();
                lista = lista + ksiazka; 
                }  
        }return lista;

Tak wygląda kod z tej klasy, a gdy zmienię String lista; na String lista = ""; i już nie pojawia się null, tylko przed wypisaniem elementów jest pusta linia. Może w innym miejscu trzeba zadeklarować zmienną lista?

Kopiuj
    public PobierzKsiazkeOkienko(BibliotekaUsluga usluga) {
        this.usluga = usluga;
        initComponents();
        taListaKsiazek.setText(usluga.listaKsiazek());
    }

A tak wygląda miejsce w którym wykorzystuję tę metodę.

PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 153
0

A czy nie lepiej skorzystać z javy8?

Kopiuj
public String listaKsiazek(){

        if(ksiazki.isEmpty()){
        return lista = "Nie ma książek w bazie";
        }else {
            for (Map.Entry<String, Ksiazka> ksiazkiEntry : ksiazki.entrySet()) {
                String IDksiazki = ksiazkiEntry.getKey();
                Ksiazka ksiazka = ksiazkiEntry.getValue();
                lista = lista + ksiazka; 
                }  
        }return lista;

Po pierwsze pobierasz id ksiazki a nigdzie z tego nie korzystasz. Po drugie po co korzystac z entrySet() jak mapa ma cos takiego jak values() ja bym zrobił tak:

Kopiuj
public String listaKsiazek(){
return ksiazki.values()
                .stream()
                .map(Ksiazka::toString)
                .collect(Collectors.joining(" tutaj dajesz sobie stirng po ktorym laczysz elementy"))
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.