2016-08-18 2 views
-1

Ich habe eine Karte (instaWords), die mit Tausenden von Wörtern gefüllt ist. Ich muss es N Element auf einmal durchlaufen. Hier ist mein Code. In diesem Code muss ich instaWords in den Blöcken von z. B. 500 Wörtern lesen und "updateInstaPhrases" mit diesen Wörtern ausführen. Irgendeine Hilfe?Eine Karte lesen N Schlüssel auf einmal

private static Map<InstaWord, List<Integer>> instaWords = new HashMap<InstaWord, List<Integer>>(); 

// here a couple of words are added to instaWords 

updateInstaPhrases(instaWords);  

private static void updateInstaPhrases(Map<InstaWord, List<Integer>> wordMap)        
throws SQLException, UnsupportedEncodingException {          
    for (Map.Entry<InstaWord, List<Integer>> entry : wordMap.entrySet()) {    
     InstaWord instaWord = entry.getKey();          
     List<Integer> profiles = entry.getValue();          
     pst.setBytes(1, instaWord.word.getBytes("UTF-8"));       
     pst.setBytes(2, instaWord.word.getBytes("UTF-8"));       
     pst.setBytes(3, (instaWord.lang == null) ?·         
     "".getBytes("UTF-8") :·              
     instaWord.lang.getBytes("UTF-8"));           
     String profilesList = "";              
     boolean first = true;               
     for (Integer p : profiles) {             
      profilesList += (first ? "" : ", ") + p;           
      first = false;                 
     }                    
     pst.setString(4, profilesList);            
     pst.addBatch();                
    }                     
System.out.println("Words batch executed");           
pst.executeBatch();            
con.commit();                  
} 

Was ich brauche, ist durch eine hashmap ‚in Chunks‘ (zB 500 Stück jedes Mal)

+1

Sie sollten Ihren Einzug wahrscheinlich so korrigieren, dass er sinnvoll ist. – khelwood

+1

Nur für den Fall, dass Sie nicht wissen ... HashMaps haben keine bestimmte Reihenfolge für sie. Dies kann bedeuten, dass das wiederholte Überspringen von Blöcken gleichzeitig nicht korrekt funktioniert, wenn es geändert wurde. Sollte dies zu einem Problem werden, wäre eine OrderedHashMap sinnvoll. – byxor

+0

@khelwood Ich habe es behoben, so viel wie ich konnte – PHA

Antwort

1

Sie halten kann einen Zähler zu durchlaufen, initialisieren für jedes Element 0 und Zuwachs, während die Elemente zu sammeln wie Sie es für richtig halten (wie, sagen wir, ArrayList<Map.Entry<InstaWord, List<Integer>>>). Wenn der Zähler (nach dem Inkrement) gleich 500 ist, verarbeiten Sie den gesamten Stapel, setzen Sie den Zähler auf 0 zurück und löschen Sie die Sammlung.

Eine weitere Option ist, dass der Zähler die Schleife steuert und explizit den Iterator deklariert, von dem Sie die Map.Entry s aus zeichnen. Auf diese Weise ist es wahrscheinlich ein bisschen klarer, was vor sich geht.