2010-11-22 13 views
3

Die Zuweisung für meine Klasse der Datenstrukturen besteht darin, den kürzesten Pfad von einem Wort zu einem anderen zu finden.Sortierung aller Wörter in einer Datei nach Länge, in einem Lesevorgang. (Java)

h Start: bluten -> Blend -> blond -> Ende: Blut, mit einem Preis von 3.

ich eine Liste von Wörtern gegeben habe, dass ich zu einer Gruppe haben eine Karte. Wo:

Schlüssel: Länge des Wortes, Wert: Set aller Wörter mit dieser Länge.

Ich habe das Programm bereits beendet, aber ich denke, ich kann die Leistung verbessern, wenn ich die Art und Weise ändere, wie ich die Sets in der Karte abspeichere. Im Moment scanne ich die Textdatei durch und speichere jedes einzelne Wort in einer ArrayList, dann gehe ich durch die ArrayList und speichere alle Wörter der Länge x in einer Menge, während ich jedes Wort aus der Liste entferne. Ich fahre so fort, beginnend mit dem ersten Element in der ArrayList, bis die Liste leer ist.

Ich frage mich, ob ich diese Sortierung tun könnte, wie ich in der Datei lese, und die ArrayList insgesamt vermeiden.

Dies ist der Code, den ich habe:

ArrayList<String> wordList = new ArrayList<String>(); 
Map<Integer, Set> setMap = new HashMap<Integer, Set>(); 
Graph pathGraph = new Graph(); 

private void readFile(String file) { 
    try { 
     FileReader f = new FileReader(file); 
     BufferedReader reader = new BufferedReader(f); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      wordList.add(line); 
     } 

    } catch (Exception e) { //Done in case of an exception 
     System.out.println("No file found."); 
    } 
} 

private void mapMaker() { 
    int wordLength = 1; 
    Set<String> wordSet = new HashSet<String>(); 
    while (!wordList.isEmpty()) { 
     wordSet = setBuilder(wordLength); 
     if (!wordSet.isEmpty()) { 
      setMap.put(wordLength, wordSet); 
     } 
     wordLength++; 
    } 
} 

private Set<String> setBuilder(int x) { 
    Set<String> wordSet = new HashSet<String>(); 
    int counter = 0; 
    while (counter < wordList.size()) { 
     if (wordList.get(counter).length() == x) { 
      wordSet.add(wordList.get(counter)); 
      wordList.remove(counter); 
     } else { 
      counter++; 
     } 
    } 
    return wordSet; 
} 

Vielen Dank für jede Eingabe im Voraus.

Antwort

4
private void readFile(String file) { 
    try { 
     FileReader f = new FileReader(file); 
     BufferedReader reader = new BufferedReader(f); 
     String word = ""; 
     while ((word = reader.readLine()) != null) { 
      int length = word.length(); 
      if(setMap.containsKey(length)) { 
       setMap.get(length).add(word); 
      } else { 
       Set set = new HashSet<String>(); 
       set.add(word); 
       setMap.put(length, set); 
      } 
     } 

    } catch (Exception e) { //Done in case of an exception 
     System.out.println("No file found."); 
    } 
} 
+0

Danke, ich wusste nicht, dass Sie das Gerät in die gespeicherten Daten zugreifen können Karte so. Deshalb hatte ich die zusätzlichen Methoden. –

2

können Sie verwenden, um eine Guava'sMultiMap:

Beispiel:

 String[] words={"world","hello","abc","bcd","abc"}; 
     SetMultimap<Integer,String> lenMap=HashMultimap.create(); 
     for(String str:words)//instead read word's from file in your case 
      lenMap.put(str.length(),str); 

Ausgang:

{3=[abc, bcd], 5=[hello, world]} 
Verwandte Themen