2016-05-07 7 views
0

i die Wege wie diese in Array 'pc_list' habenHashMap zum Speichern von Daten aus anderen Tabellen

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2] 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2] 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1] 

und in anderen Tisch 'retrieved_elements' Ich habe

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]/div[2]/a = First 100 Words 
body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]/div[3] = by Roger Priddy 
body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]/div[6]/div[1]/strong = $3.98 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]/div[2]/strong = $3.98 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]/a/div[2] = First 100 Words 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]/div[2]/strong = $3.98 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]/a/div[2] = First 100 Words 

in meinem Code, ich überprüfen Wenn die Tabelle recovered_elements einen Pfad von der Tabelle pc_liste enthält, und wenn sie existiert, speichere ich den Wert nach "=" zum Beispiel das Ergebnis, das get ist wie folgt:

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2] 
First 100 Words 
by Roger Priddy 
$3.98 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2] 
$3.98 
First 100 Words 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1] 
$3.98 
First 100 Words 

, aber ich will es in einer Karte speichern, ich in diesem Schritt ein Problem gefunden, erste ist mein Code:

HashMap<String, ArrayList<String>> map_instances = new HashMap<String, ArrayList<String>>(); 

pc_list = cp.checkSimilarity(retrieved_elements); 
     for (int a = 0; a < pc_list.size(); a++) { 
      String chemin_commun = pc_list.get(a); 

      // System.out.println(chemin_commun); 
      for (int b = 0; b < retrieved_elements.size(); b++) { 

       String chemin_complet = retrieved_elements.get(b); 

       if (chemin_complet.contains(chemin_commun)) { 

        chemin_complet = chemin_complet.split("=")[1]; 
        inst_value.add(chemin_complet); 
        //System.out.println(chemin_complet); 
         map_instances.put(chemin_commun, inst_value); 

       } 
      } 
      } 
for (Map.Entry<String, ArrayList<String>> item : map_instances.entrySet()) { 
      String key = item.getKey(); 
      System.out.println(item); 
     } 

aber die Karte, von looping ist wie folgt:

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]=[ First 100 Words, by Roger Priddy, $3.98, $3.98, First 100 Words, $3.98, First 100 Words] 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]=[ First 100 Words, by Roger Priddy, $3.98, $3.98, First 100 Words, $3.98, First 100 Words] 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]=[ First 100 Words, by Roger Priddy, $3.98, $3.98, First 100 Words, $3.98, First 100 Words] 

statt wie des Seins:

body/div[3]/div[2]/div/div[1]/div/div[2]/div/div[1]/div/div[1]/div[9]/div[2]=[ First 100 Words, by Roger Priddy, $3.98] 
body/div[3]/div[2]/div/div[2]/div[4]/div[1]/div[1]=[ $3.98, First 100 Words] 
body/div[3]/div[2]/div/div[2]/div[3]/div[1]/div[2]=[$3.98, First 100 Words] 
+0

Es sieht so aus, als würden Sie 'inst_value' nirgends initialisieren. Bitte beachten Sie, dass beim Platzieren eines Wertes in einer Karte die Referenz und nicht eine Kopie des Wertes eingefügt wird. – RealSkeptic

+0

Ich denke nicht, es ist ein PRB der Initialisierung:/ – kivok94

+0

Ja, es ist ganz sicher: Sie fügen Werte zu der gleichen Liste hinzu und setzen einen Verweis auf die gleiche Liste in allen Ihren Karteneinträgen. – RealSkeptic

Antwort

1

der Trick ist, eine andere Liste Objekt in jedem map-Eintrag haben.

Wie Sie dies tun, haben Sie ein einzelnes Listenobjekt, und Sie fügen alle Werte zu diesem einzelnen Objekt hinzu, und fügen Sie dann dieses einzelne Objekt als Wert für alle Zuordnungen ein.

So vergessen Sie inst_value. Wenn Sie stattdessen den ersten Wert für eine bestimmte chemin_commun finden, erstellen Sie eine neue Liste und legen sie in der Karte ab. Und wenn Sie das nächste Mal einen Wert finden, fügen Sie einfach die neue Liste hinzu, die Sie erstellt haben. Dadurch wird sichergestellt, dass jede chemin_commun ihre eigene Liste hat und keine gemeinsame Liste.

So ist in diesem Stück Code aussehen lassen:

if (chemin_complet.contains(chemin_commun)) { 

    chemin_complet = chemin_complet.split("=")[1]; 
    inst_value.add(chemin_complet); 
    //System.out.println(chemin_complet); 
    map_instances.put(chemin_commun, inst_value); 

} 

Ändern Sie es an:

if (chemin_complet.contains(chemin_commun)) { 

    ArrayList<String> currentList = map_instances.get(chemin_commun); 

    if (currentList == null) { 
     // This is the first time we see this chemin_commun, so 
     // Create a new list for it and put it in the map. 
     currentList = new ArrayList<>(); 
     map_instances.put(chemin_commun, currentList); 
    } 

    // At this point currentList is never null. It is the specific list 
    // that is mapped by the current chemin_commun. So add the value 
    // to this list 
    chemin_complet = chemin_complet.split("=")[1]; 
    currentList.add(chemin_complet); 

} 

Ein paar allgemeine Java Hinweise:

  • Variable und Methodennamen sollte keine Unterstriche enthalten. Java hat Code-Konventionen. Kurz:
    • Typnamen (Namen von Klassen, Interfaces, Aufzählungen) sollte mit einem Großbuchstaben beginnen und einen neuen Großbuchstaben am Anfang eines jedes Wortes, zum Beispiel MyParser oder VeryLongClassName.
    • Methoden- und Variablennamen sollten mit einem Kleinbuchstaben beginnen und am Anfang jedes neuen Wortes einen Großbuchstaben haben. Zum Beispiel cheminCommun, cheminComplet usw.
    • Konstanten (final static Felder oder Enum-Konstanten) sind alle in Großbuchstaben und sie sind die einzigen, in denen einzelne Wörter unterstreicht: BASE_SIZE, PROPERTY_NAME usw.)
  • Programm zur Unterstützung der Schnittstelle nicht zur Klasse.Das heißt, deklarieren Sie Ihre Variablen nicht als ArrayList, sondern als List, nicht als HashMap sondern als Map. Weisen Sie ihnen dann nur eine bestimmte Klasse zu. So dass Ihre Karte sollte eigentlich deklariert werden:

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

    Die Erklärung mit der Schnittstelle ist Map (und List), das eigentliche Objekt ist ein HashMap. Und dann deklarieren Sie als List<String> anstelle von ArrayList<String>. Wenn Sie in Zukunft einen LinkedList oder einen TreeMap verwenden möchten, ist es einfacher, den Code zu ändern.

+0

danke realskeptic, es ist jetzt klar, Ihre explination (y) – kivok94

Verwandte Themen