KeySet() anwenden

Mens

Mitglied
Hallo alle,
bin neu hier und ich habe ein kleines problem.
Ich habe morgen eine Prüfung über HashMap's, ArrayList's etc.
Mein problem ist das folgende:
Ich muss aus einer HashMap von Büchern, eine Methode schreiben die alle bücher zeigt die verfügbar sind, und diese dann in einer ArrayList tun. Der Lehrer hat mir gesagt dass das mit einem KeySet() möglich ist. Ich weiss jetzt nicht wie ich das alles machen soll. Hier der Code aus der Klasse (ist leider auf Französisch, aber ich denke ihr versteht was da gemeint ist):
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bibliotheque.wrk;

import bibliotheque.beans.Livre;
import bibliotheque.beans.Location;
import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * @author izairim
 */
public class Bibliotheque implements Constantes {

    private WrkDate wrkDate;
    private HashMap laBibliotheque;
    private ArrayList locations;

    public Bibliotheque() {
        laBibliotheque = new HashMap();
        wrkDate = new WrkDate(DATECOURANTEPATTERN, DATEPATTERN, DATEPATTERN);

    }

    public boolean ajouteUnLivre(Livre unLivre) {
        boolean ajouteOk = false;
        if (unLivre != null) {
            String isbn = unLivre.getIsbn();
            boolean existe = laBibliotheque.containsKey(isbn);
            if (existe == false) {
                laBibliotheque.put(isbn, unLivre);
                ajouteOk = true;
            }
        }
        return ajouteOk;
    }

    public boolean emprunteUnLivre(String emprunteur, String isbn) {
        boolean ajouteOk = false;
        String date = wrkDate.donneDate();
        String heure = wrkDate.donneHeure();

        Livre unLivre = (Livre) laBibliotheque.get(isbn);
        if (unLivre.isDisponible() == true) {
            unLivre.setDisponible(false);
            Location location = new Location(emprunteur, date, heure);
            if (locations == null) {
                locations = new ArrayList();

            }
            locations.add(location);
            unLivre.setLesLocations(locations);
            laBibliotheque.put(isbn, unLivre);
            ajouteOk = true;
        }
        return ajouteOk;
    }

    public boolean emprunteDesLivres(String emprunteur, ArrayList<String> lesIsbn) {
        boolean emprunteOk = false;



        return emprunteOk;
    }

    private boolean restitueUnLivre(String isbn) {
        boolean ajouteOk = false;

        Livre unLivre = (Livre) laBibliotheque.get(isbn);
        if (!unLivre.isDisponible()) {
            unLivre.setDisponible(true);
            laBibliotheque.put(isbn, unLivre);
            ajouteOk = true;
        }
        return ajouteOk;
    }

    public boolean restitueDesLivres(ArrayList<String> lesIsbn) {
        boolean ok = false;
        for (int i = 0; i < laBibliotheque.size(); i++) {
            String isbn = lesIsbn.get(i);
            restitueUnLivre(isbn);
            ok = true;
        }
        return ok;
    }

    public ArrayList<Livre> chercheLesLivresDisponibles(String genre) {
        Key<String> lesCles = 
        laBibliotheque.get(genre);

        return null;
    }

    public ArrayList<Livre> chercheLesLivresDisponibles() {
        return null;
    }

    public ArrayList<Livre> chercheLesLivresNonDisponibles(String genre) {
        return null;
    }

    public ArrayList<Livre> chercheLesLivresNonDisponibles() {
        return null;
    }

    public ArrayList<Location> chercheHistoriqueLocation(String isbn) {
        return null;
    }

    public ArrayList<String> chercheLesIsbn() {
        return null;
    }
}
Gruss Mens
 

Murray

Top Contributor
Mit HashMap.keySet erhält man die Keys der Map, in deinem Fall also die ISBNs. Insofern verstehe ich nicht ganz, wie man mit keySet() die Liste der Bücher ermitteln sollte; dafür wäre HashMap.values() der richtige Ansatz.
 

Mens

Mitglied
Mit HashMap.keySet erhält man die Keys der Map, in deinem Fall also die ISBNs. Insofern verstehe ich nicht ganz, wie man mit keySet() die Liste der Bücher ermitteln sollte; dafür wäre HashMap.values() der richtige Ansatz.

Also mein hat es mir so erklärt.
Ich solle mit keySet alle bücher nach einem genre ermitteln, das was ich bekomme muss ich dann in in einer ArrayList (mit einer Collection glaube ich)rein tun.
 

Murray

Top Contributor
Ich gebe zu: ich spreche so gut wie kein Französisch; wo findet sich im Programm denn ein Genre wieder? Ich sehe als zentrale Struktur nur eine HashMap, in der Bücher mit der ISBN als Key abgelegt werden.
 

Mens

Mitglied
Also ein genre befindet sich in der Klasse Livre.
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bibliotheque.beans;

import bibliotheque.Constantes;
import java.util.ArrayList;
import javax.tools.JavaFileManager.Location;

/**
 *
 * @author izairim
 */
public class Livre implements Constantes {

    protected String genre;
    private String titre;
    private String auteur;
    private String isbn;
    private boolean disponible;
    ArrayList<Location> lesLocations;

    public Livre() {
        disponible = true;
        lesLocations = new ArrayList<Location>();

    }

    public Livre(String titre, String auteur, String isbn) {
        this.titre = titre;
        this.auteur = auteur;
        this.isbn = isbn;
    }

    public String getAuteur() {
        return auteur;
    }

    public void setAuteur(String auteur) {
        this.auteur = auteur;
    }

    public boolean isDisponible() {
        return disponible;
    }

    public void setDisponible(boolean disponible) {
        this.disponible = disponible;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public ArrayList<Location> getLesLocations() {
        return lesLocations;
    }

    public void setLesLocations(ArrayList<Location> lesLocations) {
        this.lesLocations = lesLocations;
    }

    public String getTitre() {
        return titre;
    }

    public void setTitre(String titre) {
        this.titre = titre;
    }
}
 

Mens

Mitglied
javaak.jpg

so sollte es sein.
 
G

Gastredner

Gast
Ein KeySet enthält einfach alle Keys deiner Map. Indem du über das KeySet iterierst und dir die zu den Keys gehörigen Values ausgeben lässt, kannst du jedes Buch auf sein Genre überprüfen und es dementsprechend bei einer Übereinstimmung in die Ergebnisliste packen:
Java:
public List<Livre> getBooksByGenre(String genre) {
	List<Livre> result = new ArrayList<Livre>();
	Set<String> keys = laBibliotheque.keySet();
	for (String key: keys) {
		Livre l = laBibliotheque.get(key);
		if (l.getGenre().equals(genre)) {
			result.add(l);
		}
	}
	return result;
}
 

Mens

Mitglied
Ein KeySet enthält einfach alle Keys deiner Map. Indem du über das KeySet iterierst und dir die zu den Keys gehörigen Values ausgeben lässt, kannst du jedes Buch auf sein Genre überprüfen und es dementsprechend bei einer Übereinstimmung in die Ergebnisliste packen:
Java:
public List<Livre> getBooksByGenre(String genre) {
	List<Livre> result = new ArrayList<Livre>();
	Set<String> keys = laBibliotheque.keySet();
	for (String key: keys) {
		Livre l = laBibliotheque.get(key);
		if (l.getGenre().equals(genre)) {
			result.add(l);
		}
	}
	return result;
}
Ich werde das mal probieren, danke erstmals.
 

Murray

Top Contributor
Dazu braucht man aber das keySet nicht; man könnte doch auch direkt über die values interieren:

Java:
public List<Livre> getBooksByGenre(String genre) {
    List<Livre> result = new ArrayList<Livre>();
    Colection<Livre> livres = laBibliotheque.values();
    for (Livre li : livres) {
        if (l.getGenre().equals(genre)) {
            result.add(l);
        }
    }
    return result;
}
 

Mens

Mitglied
Ich habe das jetzt so gemacht.
Java:
    public ArrayList<Livre> chercheLesLivresDisponibles(String genre) {
        ArrayList<Livre> livresDispo = new ArrayList<Livre>();
        Livre unLivre = (Livre) laBibliotheque.get(genre);
        Set<String> lesCles = laBibliotheque.keySet();

        if (unLivre.isDisponible()) {
            for (String key : lesCles) {
                if (unLivre.getGenre().equals(genre)) {
                    livresDispo.add(unLivre);
                }
            }
        }
        return livresDispo;
    }
 

Murray

Top Contributor
Wenn Du Bücher in die Map laBibliotheque einstellst, dann verwendest Du als Key die ISBN. Deshalb dürfte ein get mit einem Genre als Argument eigentlich immer fehlschlagen.
 

Mens

Mitglied
Ich habe jetzt meinen Code überarbeiten, denke jetzt sollte es gehen.
Java:
    public ArrayList<Livre> chercheLesLivresDisponibles(String genre) {
        
        ArrayList liste = null;
        Set<String> lesIsbn = laBibliotheque.keySet();
        ArrayList lesCles = new ArrayList(lesIsbn);
        for (int i = 0; i < lesCles.size(); i++) {
            String isbn = (String) lesCles.get(i);
            Livre unLivre = (Livre) laBibliotheque.get(isbn);
            if (unLivre.isDisponible()) {
                if (unLivre.getGenre().equals(genre)) {
                    if (liste == null) {
                        liste = new ArrayList();
                    }
                    liste.add(unLivre);
                }
            }
        }
        return liste;
    }
 

Murray

Top Contributor
So könnte es tatsächlich gehen - allerdings fällt das unter die Kategorie "von hinten durch die Brust ins Auge getroffen".

Wesentlich direkter ginge es so:

Java:
    public ArrayList<Livre> chercheLesLivresDisponibles(String genre) {
        
        ArrayList<Livre> liste = null;
        Collction<Livre> lesLivres = laBibliotheque.values();
        for ( Livre unLivre : lesLivres) {
            if (unLivre.isDisponible()) {
                if (unLivre.getGenre().equals(genre)) {
                    if (liste == null) {
                        liste = new ArrayList();
                    }
                    liste.add(unLivre);
                }
            }
        }
        return liste;
    }
 
G

Gastredner

Gast
Wobei ich dazu raten würde, die ArrayList direkt zu initialisieren - eine leere Liste ist meiner Meinung nach der Rückgabe von null vorzuziehen.
 

Mens

Mitglied
Wobei ich dazu raten würde, die ArrayList direkt zu initialisieren - eine leere Liste ist meiner Meinung nach der Rückgabe von null vorzuziehen.
so?
Java:
  public ArrayList<Livre> chercheLesLivresDisponibles(String genre) {
        
        ArrayList liste = new ArrayList();
        Set<String> lesIsbn = laBibliotheque.keySet();
        ArrayList lesCles = new ArrayList(lesIsbn);
        for (int i = 0; i < lesCles.size(); i++) {
            String isbn = (String) lesCles.get(i);
            Livre unLivre = (Livre) laBibliotheque.get(isbn);
            if (unLivre.isDisponible()) {
                if (unLivre.getGenre().equals(genre)) {
                    liste.add(unLivre);
                }
            }
        }
        return liste;
    }
 
G

Gastredner

Gast
Genau. So kann der Aufrufer zumeist direkt mit der leeren Liste weiterarbeiten und wird dementsprechend nur ein leeres Ergebnis bekommen. Bei der Rückgabe von null müsste der Aufrufer immerzu darauf prüfen oder es hinnehmen, dass es beim Aufruf der Methode mit einem nicht bekannten Genre anschließend zu einer NullPointerException kommt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
nadoria HashMap-->Methode keySet() Java Basics - Anfänger-Themen 10
A "Super" anwenden Java Basics - Anfänger-Themen 3
L Anpassung der Spaltenbreite auch auf eine zweite Tabelle anwenden Java Basics - Anfänger-Themen 8
P Methoden richtig anwenden Java Basics - Anfänger-Themen 3
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
D kann man vor dem CSVRecord, replace Anweisung anwenden ? Java Basics - Anfänger-Themen 2
V Vererbung (wie) kann man eine 'super'-Methode auf ein Objekt anwenden ? Java Basics - Anfänger-Themen 6
T Mehrere Methoden in der main-Methode verknüpfen und aufeinander anwenden Java Basics - Anfänger-Themen 2
T Erste Schritte Methoden anwenden und erkennen Java Basics - Anfänger-Themen 5
I GroupLayout richtig anwenden Java Basics - Anfänger-Themen 4
S JProgressBar richtig anwenden Java Basics - Anfänger-Themen 27
Z Methoden Scanner Methode Anwenden Java Basics - Anfänger-Themen 4
G Metrik auf API anwenden Java Basics - Anfänger-Themen 4
E Datentypen Klasse Vector aus der Standard-API anwenden Java Basics - Anfänger-Themen 7
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5
bastiann Kann man Inputstream nur auf ein Zeichen anwenden? Java Basics - Anfänger-Themen 5
M Methode richtig anwenden. Java Basics - Anfänger-Themen 5
P Methoden der Unterklasse in Oberklassen-Datentyp anwenden Java Basics - Anfänger-Themen 24
U Array.sort auf variable Array-Größe anwenden Java Basics - Anfänger-Themen 3

Ähnliche Java Themen


Oben