2016-04-22 14 views
0

Ich möchte überprüfen, ob eine bestimmte String in meinem TreeSet ist.TreeSet gibt false zurück, wenn es true zurückgeben soll?

Es gibt false zurück, wenn es zurückgeben sollte true, aber ich bin nicht sicher, wo ich in meinem Code versaut. Hier ist der Code:

HashSet<String> dict = new HashSet<String>(); 
//TreeSet<String> dict = new TreeSet<String>(dicty); //snabbare såhär? 
int ranNum; 
String randomWord; 

public AngloTrainer(String dictionaryFile) throws IOException { 
    loadDictionary(dictionaryFile); 
    System.out.println(dict.size() + " words loaded from dictionary.txt "); 
    Random randNumb = new Random(); 
    ranNum = (randNumb.nextInt(6) + 4); 
    //randomWord = randomLetters(ranNum); 
    randomWord = "carpatrol"; 
    System.out.println("The random letters are: " + randomWord); 
    Scanner reader = new Scanner(System.in); 
    System.out.println("Guess a word!"); 
    //System.out.println(dict.contains("car")); 
    //System.out.println(dict.contains("patrol")); 
    //System.out.println(dict.contains("rat")); 
    while(reader.hasNextLine() != false){ 
     String gWord = reader.next(); 
     if(includes(sort(randomWord), sort(gWord))){ 
      if(dict.contains(gWord)){ 
       System.out.println("ok!"); 
      }else{ 
       System.out.println("not ok!"); 
      } 
     }else{ 
      System.out.println("not ok!"); 
     } 
    } 
    //reader.close(); 
} 

private String sort(String s){ 
    char[] charArray = s.toCharArray(); 
    Arrays.sort(charArray); 
    return new String(charArray); 
} 

private void dumpDict() { 
    for(String word: dict){ 
     System.out.println(word); 
    } 
} 

private void loadDictionary(String fileName) throws IOException{ 
    BufferedReader bufRead = new BufferedReader(new FileReader(new File(fileName))); 
    while(bufRead.readLine() != null){ 
     dict.add(bufRead.readLine()); 
    } 
    //bufRead.close(); 
} 

private String randomLetters(int length) { 
    Random randomGenerator = new Random(); 
    String letters = "aabcdeefghiijklmnoopqrstuuvwxyyz"; 
    StringBuffer buf = new StringBuffer(length); 
    for (int i = 0; i < length; i++) 
     buf.append(letters.charAt(randomGenerator.nextInt(letters.length()))); 

    return buf.toString(); 
} 

private boolean includes(String a, String b) { 
    if (b == null || b.length() == 0) 
     return true; 
    else if (a == null || a.length() == 0) 
     return false; 
    //precondition: a.length() > 0 && b.length() > 0 
    int i = 0, j = 0; 
    while (j < b.length()) { 
     if (i >= a.length() || b.charAt(j) < a.charAt(i)) 
      return false; 
     else if (b.charAt(j) == a.charAt(i)) { 
      i++; j++; 
     } else if (b.charAt(j) > a.charAt(i)) 
      i++; 
    } 
    //postcondition: j == b.length() 
    return true; 
} 

die include() Methode funktioniert gut, vergleicht es zwei Strings zu sehen, ob die Buchstaben in einer von ihnen in der anderen enthalten ist.

include("car"); //returns true 
include("patrol"); //returns true 
include("rat"); //returns true 

Aber wenn die Worte „Auto“ Eingabe „Patrouille“ und „Ratte“ in dem obigen Code, gibt es „false“ aus dem dict.contains(word)

Und alle drei Worte oben ist, in meinem .txt-Datei.

Haben Sie irgendwelche Ideen, was falsch gelaufen ist? Wenn du mehr von meinem Code benötigst, werde ich ihn bearbeiten, lass es mich bitte wissen.

EDIT: Manchmal, wenn ich versuche, ein paar Worte zu erraten, es ist wahr zurück, aber die meiste Zeit es gibt false zurück (dict.contains()).

EDIT2: hinzugefügt alle meine Code.

+0

Welche gibt false zurück? 'include' oder der aktuelle Code? – Dadani

+4

Geben Sie als Richtlinie die Mindestanzahl an Code an, die zum Reproduzieren des Fehlers erforderlich ist. – flakes

+0

Auch ich bin neugierig, was 'sort' hier macht – flakes

Antwort

1

Von Kommentar:

loadDictionary() funktioniert, wie es sollte

jedoch, dass völlig unwahr ist. Nun, da wir es sehen können, können wir Ihnen sagen, dass es nur jedes zweite Wort lädt.

BufferedReader bufRead = new BufferedReader(new FileReader(new File(fileName))); 
while(bufRead.readLine() != null){ 
    dict.add(bufRead.readLine()); 
} 

Die readLine() im while Schleife liest die erste Zeile. Die readLine() in der add() Aufruf liest die zweite Zeile und fügt sie dict hinzu.

Die erste Zeile wird verworfen.

Dies wird so wiederholt, dass nur gerade Zeilen zu dict hinzugefügt werden.

Ändern Sie den Code in erinnern die Zeile von der Schleife gelesen.
Vergessen Sie auch nicht, die Datei zu schließen, z. indem Sie versuchen-mit-Ressourcen.

try (BufferedReader bufRead = new BufferedReader(new FileReader(new File(fileName)))) { 
    for (String line; (line = bufRead.readLine()) != null;) { 
     dict.add(line); 
    } 
} 
+0

Oh ich sehe, vielen Dank für die Hilfe Andreas! –

Verwandte Themen