2016-03-26 4 views
0

Für eine Zuweisung wurde ich gebeten, ein TXT-Dokument in eine Hashmap vorzuverarbeiten, um eine effiziente Wortsuchfunktion zu haben. "Um eine effiziente Wortsuche zu ermöglichen, bearbeitet Ihr Code das Dokument vor und speichert alle im Dokument gefundenen Wörter und die Zeilen, in denen sie sich in einer Hash-Tabelle befinden (die Wörter sind die Schlüssel und die Zeilen die Werte)." Ich kann nicht für das Leben von mir herausfinden, warum ich den alten Wert von einem Schlüssel mit einem neuen Wert für den Schlüssel nicht ersetzen kann. Hier ist der Konstruktor, der das Dokument vorverarbeitet.Vorverarbeitung txt Dokument in eine Hashmap mit String als Schlüssel, und Integer ArrayList als Wert

HashMap<String, ArrayList<Integer>> map = new HashMap<String, ArrayList<Integer>>(); 

public wordSearch() { 
    char charChecker; 
    String word; 
    ArrayList<Integer> count = new ArrayList<Integer>(); 
    try{ 
     URL url = new URL("http://homes.soic.indiana.edu/classes/spring2016/csci/c343-yye/docu.txt"); 
     Scanner in = new Scanner(url.openStream()); 
     int lineNumber = 1; 
     while(in.hasNext()) { 
      String str = in.nextLine(); 
      for(int i = 0; i < str.length(); i++) { 
       for(int j = i+1; j < str.length(); j++) { 
        charChecker = str.charAt(j); 
        //check for word 
        if(charChecker == ' ' || 
         charChecker == ',' || 
         charChecker == '.' || 
         charChecker == '\n') { 
          word = str.substring(i, j); 
          //if word is already in HashMap 
          if(this.map.containsKey(word)) { 
           count = this.map.get(word); 
           count.add(lineNumber); 
           //System.out.println("[" + word + ", " + count.toString() + "]"); 
           this.map.put(word, count); 
          } 
          //otherwise add word to HashMap 
          else { 
           count.add(lineNumber); 
           System.out.println(count.toString()); 
           this.map.put(word, count); 
           //System.out.println("[" + word + ", " + count.toString() + "]"); 
          } 
          i = j+1; 
          count.clear(); 
        } 
       } 
      } 
      lineNumber+=1; 
     } 
    in.close(); 
    }catch(IOException e) { 
     System.out.println(e.getMessage()); 
    } 
    System.out.println(this.map.toString()); 
} 

Irgendein Rat, wohin man von hier geht, würde geschätzt werden.

Antwort

1

Statt count.clear(); verwenden count = new ArrayList<Integer>();

Bestehende Code hat dieselbe Instanz von Zählung für alle Tasten

+0

Wow, das war so einfach. Ich danke dir sehr – rsorce

0

Eine Alternative zu prüfen wäre, wenn Zeilennummern für ein Wort existiert.

HashMap<String, List<Integer>> wordMap = new HashMap<>(); 
List<Integer> lineNumbers; 

if(...){ 
    word = str.substring(i, j); 
    if ((lineNumbers = wordMap.get(word)) != null){ 
     lineNumbers.add(lineNumber); 
    }else { 
     lineNumbers = new ArrayList<>(); 
     lineNumbers.add(lineNumber); 
     wordMap.put(word, lineNumbers); 
    } 
    i = j+1 
} 
Verwandte Themen