2017-04-20 16 views
2

Ich habe diesen Code zusammengestellt, mit ein wenig Hilfe natürlich. Der Zweck davon ist, eine Benutzernachricht zu nehmen und die Textdatei zu überprüfen, um zu sehen, ob irgendwelche Wörter in der Nachricht auch in der Textdatei gefunden werden (ungefähr 50 gebräuchliche englische Wörter). Mein Problem ist, dass ich auch das Auftreten jedes Wortes in der Nachricht zählen möchte. Ich habe versucht, einen int-Zähler hinzuzufügen, aber ich bekomme Fehler, weil ich ein String-Objekt mit einer ganzen Zahl nicht zählen kann. Wenn ich nur hinzufügen, einen Zähler in:Wie man Wörter in einer Hashmap zählt

for (String userInput : message.split(" ")) 
{ 
    if (legalEnglishWords.contains(userInput)) 
    { 
     System.out.println(userInput + " is an English word "); 
     count++; 
     System.out.println(userInput + " occurs " + counter + " times"); 
    } 
} 

erhalte ich eine Iteration für jedes Wort, das das Recht Wort Test bestanden wird, mich mit dem Ausgang verlassen, die wie

Please enter in a message: 
transformers are is is this 

transformers occurs 0 times 
are is an English word 
are occurs 1 times 
is is an English word 
is occurs 2 times 
is is an English word 
is occurs 3 times 
this is an English word 
this occurs 4 times 

Wie Sie die Zählung zu sehen ist total falsch und ich zeige ein Wort so oft wie es in der Nachricht vorkommt. Ich möchte es nur einmal anzeigen lassen. Ich über eine & & zu der oben genannten wenn Anweisung, um zu überprüfen, ob das Wort bereits gedruckt wurde, aber ich weiß nicht, was zu setzen. Ich weiß auch nicht, wie man die einzelnen Wörter von der if-Anweisung zählt, anstatt jedes Mal zu zählen, wenn die if-Anweisung eingegeben wird. Im Grunde brauche ich ein wenig Hilfe beim Zählen einzelner Wörter, während ich nur das Wort "Englisch" einmal neben der Anzahl der Male, die es am Ende passiert ist, zeige. Ich bin immer noch ein bisschen neu in Java und verstehe alles, was in meinem Programm passiert und warum. Wenn es mir möglich ist, möchte ich versuchen, diesen Code nur zu ergänzen, um das Notwendige zu tun, anstatt eine Totalüberholung mit Dingen, die ich möglicherweise nicht verstehe. Vielen Dank euch allen!

import java.io.*; 
import java.util.HashSet; 
import java.util.Scanner; 

public class Affine_English3 
{  
     public static void main(String[] args) throws IOException 
     { 
       HashSet<String> legalEnglishWords = new HashSet<String>(); 
       Scanner file = new Scanner(new File("example.txt")); 
       int counter = 0; 

       while (file.hasNextLine()) 
       { 
        String line = file.nextLine(); 

       for (String word : line.split(" ")) 
       { 
        { 
         legalEnglishWords.add(word); 
        } 
       } 
       } 

       file.close(); 

       Scanner scan = new Scanner(System.in); 
       System.out.println("Please enter in a message: "); 
       String message = scan.nextLine(); 
       scan.close(); 

       for (String userInput : message.split(" ")) 
       { 
        if (legalEnglishWords.contains(userInput)) 
        { 
         System.out.println(userInput + " is an English word "); 
         counter++; 
        } 
        System.out.println(userInput + " occurs " + counter + " times"); 
       } 
     } 
} 

Dies ist eine Kopie meiner „Common englische Wort“ Textdatei

the he at but there of was be not use and for can 
a on have all each to are from where which in by 
is with line when do you his had your how that they 
it i word said if this what an as or we she their 
+0

Sie müssen legalEnglishWords.equals verwenden (userinput) statt enthält. Dies wird dein Problem beheben. –

+1

Haben Sie eine 'Map ' wobei 'String' das' legalEnglishWord' und 'Integer' die Zahl ist –

+1

@Learner' legalEnglishWords' ist eine Menge von Strings. Es wird nie einer einzelnen Saite gleich sein. –

Antwort

3

Sie auf dem richtigen Weg sind, aber Sie werden die Sammlungen Speicherung der Daten ändern müssen. Wenn Sie für jedes Wort eine Zählung wünschen, dann erfordert dies in Java ein Map. Eine Map ordnet einer Reihe von Werten eine Reihe von Schlüsseln zu - etwa die Zuordnung von Namen zu Alter. In Ihrem Fall möchten Sie Wörter zu Zählern zuordnen.

Also mit einer Karte beginnen erklärt wie:

Map<String, Integer> wordCounts = new HashMap<>(); 

Dann wird jedes Mal, wenn Sie auf ein Wort kommen Sie so etwas wie tun:

if (!wordCounts.containsKey(word)) 
    wordCounts.put(word, 1); 
else 
    wordCounts.put(word, wordCounts.get(word) + 1); 

Wenn Sie Java verwenden 8 ist (wohl) elegantere Syntax:

wordCounts.compute(word, n -> n == null ? 1 : n + 1); 

Nachdem Sie den gesamten Text bearbeitet haben, können Sie dann th ausdrucken e counts:

for (String word: wordCounts.keySet()) { 
    System.out.println("Word " + word + " occurred " + wordCounts.get(word) + " times"; 
} 
+0

Also habe ich ein wenig aktualisiert, um meinen Code – Nolan

+0

Downvote statt durch schlechte Manipulation upvote. Ich habe Ihre Antwort bearbeitet, um sie zu korrigieren. – davidxxx

+0

@davidxxx Können Sie Ihren Downvote ein bisschen mehr erklären? Soweit ich sehen kann, haben Sie in Ihrem Schnitt nur "Sie haben" in "Sie haben" geändert (trotz der Kontraktion, die seit dem 16. Jahrhundert in Gebrauch ist (https://www.merriam-webster.com/dictionary/ Sie haben)) – sprinter

1

Was Sie versuchen, ist, die Zählung jedes englischen Wortes (wie in example.txt definiert) zu verfolgen. Sie benötigen also eine Map anstelle einer Set.

In Pseudo-Code, es sieht aus wie:

Map<String, Integer> legalEnglishWord = new HashMap<>(); 
for each word in "exmample.txt" { 
    legalEnglishWords.put(word, 0); 
} 

// handle input 
for each word in inputMessage { 
    if (legalEnglishWords.containsKey(word)) { 
     legalEnglishWords.put(word, legalEnglishWord.get(word) + 1); 
    } 
    // or simply 
    legalEnglishWords.computeIfPresent(word, count -> return count+1); 
} 

// At this point, you have each legal words, and the appearances of 
// each legal word in the input message. 
Verwandte Themen