2017-04-19 2 views
2

Ich mache ein Projekt für die Hochschule und habe eine Wand mit der Suche durch meine hashmap und fügen Sie die Ergebnisse zu einer Liste.Hashmap durchsuchen und Ergebnisse zu einer Liste hinzufügen

Bisher habe ich eine Empfehlung Klasse mit diesen Variablen sowie Getter, Setter Konstruktor und hashcode und ist gleich:

private String title, queryName,Director,summary,myComments,category; 
private double Rating; 
private int myRating; 
private ArrayList<String> cast = new ArrayList<>(); 

Also, was ich tun möchte Suche durch diese Karte von Empfehlungen für einen Schauspieler Name ist und füge die Ergebnisse zu einer Liste hinzu. Das habe ich bisher gemacht: private Karte recs = neue HashMap <>();

public void byActor(String actor) 
{ 

    if(recs.containsKey(actor)) 
    { 

     System.out.println(" The Actor "+actor + " has been in these films "); 

    } 

Wenn der Schauspieler nicht in der hashmap ist ich habe Empfehlungen aus einem Website-API zu erhalten, die es als Liste oder Empfehlungen zurückgeben soll, und fügen Sie die hashmap

(was ein lokaler Speicher sein wird)

Wie füge ich die Ergebnisse der Suche zu einer Liste hinzu und füge eine Liste zu einer hashmap hinzu?

+0

Was meinst du mit 'sollte es als Liste zurückgeben? Eine "Liste" von "Empfehlung"? – aUserHimself

+0

@aUserHisself hallo leid, es ist eine Liste von Empfehlungen. Ill edit, um das hinzuzufügen :) – EmilyP

+0

Was hält 'aktorMap'? Ist es die Antwort von der Website-API? – aUserHimself

Antwort

1

Es ist s Es scheint, dass Sie ein lokales Geschäft erstellen sollten, das eine Karte von Akteursnamen und eine Liste von Empfehlungen enthält (ich würde wahrscheinlich Empfehlungsfilm nennen).

Methode lokale Speicher

public Map<String, List<Recommendation>> localStoreOfMovies() { 

    // Call an API based on actor names, or maybe you have local list 
    Map<String, List<Recommendation>> localStore = 
     new HashMap<String, List<Recommendation>>(); 

    List<Recommendation> movies = new List<Recommendation>(); 
    // Add robert de niro movies to movies list 
    localStore.put("robertdeniro", movies); 

    return localStore; 
} 

Get Liste der Empfehlung zu erstellen, basierend auf Schauspieler

Wenn Sie in der Lage sind, den lokalen Speicher zu erstellen und eine Karte von Akteuren zu erstellen, und die Liste der Empfehlungen, die Liste basierend auf Schauspieler bekommen wird einfach, können Sie einfach tun

public List<Recommendation> byActor(String actor) { 
    // all movies are coming from instance local store 
    return localStore.get(actor); 
} 
+0

ok also meine antwort sollte funktionieren, du iterierst über die gesamte filme liste, die wohl eine instanzvariable ist? und dann eine verschachtelte for-Schleife haben, um die Umwandlung zu überprüfen, um zu sehen, ob der Akteur den Namen des Akteurs enthält, der an die byActor-Methode übergeben wurde. wenn es eine neue Liste enthält und zurückkehrt, nachdem Sie alle Neukombinationen durchlaufen haben. –

+0

Die Frage lautet: Jedes Mal, wenn ein Name eines Schauspielers eingegeben wird, sucht das System im lokalen Geschäft nach diesem Namen (Hash Map). Ich denke, ich muss irgendwie die hashmap der Empfehlungen suchen (die in einer Datei gespeichert ist), um zu sehen, ob der Schauspieler in einer Besetzung (eine ArrayList) ist, und dann die Ergebnisse zu einer Liste hinzufügen. Also denke ich, dass ich durch die Hashmaps iterieren muss? – EmilyP

+0

@EmilyP also hast du einen lokalen Speicher einer hashmap, von ? Der Schlüssel ist der Name des Schauspielers? wenn dies der Fall ist, wird jeder Schauspieler nur eine Empfehlung (Film) haben. Sie erwähnten, dass dies eine Aufgabe ist, wo Sie Code vor der Hand oder nur Anweisungen gegeben haben, was getan werden muss? –

0

Um Daten auf einer Liste hinzufügen

myList.add(myData); 

ein Daten aus einer Liste zu einer Karte hinzuzufügen:

myMap.put(myKey, myValue); 

, wenn Sie alle Daten aus der Liste hinzufügen mögen:

for(dataType data : myList){ // this is a foreach 
    myMap.put(myKey, myValue); 
} 

Prost

1

Angenommen, Sie möchten für jeden Akteur in Ihrer Karte eine Liste mit Recommendation s haben, benötigen Sie eine Map<String, List<Recommendation>>. Dies wird multimap genannt.

Map<String, List<Recommendation>> recommendationsByActor = new HashMap<>(); 

Wenn Sie Java verwenden 8, können Sie die computeIfAbsent method verwenden, um eine Empfehlung für einen Schauspieler an, wie folgt: Diese erhalten die Liste der Empfehlungen für einen Schauspieler

recommendationsByActor 
    .computeIfAbsent(actorName, k -> new ArrayList<>()) 
    .add(recommendation); 

, wenn es waren schon eine oder mehrere Empfehlungen für diesen Akteur in der Karte. Wenn es für diesen Akteur noch keine Empfehlungen gibt, erstellt computeIfAbsent eine leere ArrayList für diesen Akteur und fügt sie in die Karte ein. In beiden Fällen wird die angegebene Empfehlung zur Liste der Empfehlungen für diesen Akteur hinzugefügt:.

Wenn Sie nur die Liste der Empfehlungen für einen bestimmten Schauspieler zu bekommen, füllen Sie einfach tun:

List<Recommendation> recommendations = recommendationsByActor.get(actorName); 

Dies wird die Liste der Empfehlungen für einen bestimmten Akteur zurück oder null, wenn es keine Empfehlungen für er/sie.

EDIT:

Wenn stattdessen eine leere ArrayList für einen Schauspieler zu schaffen, die keine Empfehlungen in der Karte hat, müssen Sie Empfehlungen eine Website API wegzugehen, können Sie den Anruf zu computeIfAbsent wie folgt ändern:

List<Recommendation> recommendations = recommendationsByActor 
    .computeIfAbsent(actorName, this::getRecommendationsForActorFromWebAPI); 

Wo getRecommendationsForActorFromWebAPI würde eine Instanzmethode in der gleichen Klasse sein, mit der folgenden Signatur:

private List<Recommendation> getRecommendationsForActorFromWebAPI(String actorName) { 

    // TODO do the dirty work: call API and return recs list for actor 
} 

In diesem Fall gibt computeIfAbsent die Liste der Empfehlungen für den angegebenen Akteur entweder lokal aus der Karte zurück (wenn die Liste bereits vorhanden ist), oder er ruft die Liste der Empfehlungen aus dem API-Aufruf ab und fügt sie hinzu die Karte für diesen Schauspieler, bevor Sie ihn zurückgeben.

+1

Oh, ich habe 'computeIfAbsent' nie bemerkt und meine Multimaps immer mit einem if bearbeitet. Danke dafür, mein Herr. –

Verwandte Themen