Pobieranie wartości z HashMap

0

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

    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?

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?
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

System.out.println(ksiazka)

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

0

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

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.

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.

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.

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ć?

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ć

lista = "";
0
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?

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

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

0

A czy nie lepiej skorzystać z javy8?

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:

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

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