2016-03-21 4 views
1
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.PrintWriter; 
import java.util.Scanner; 


public class Vowels 
{ 
public static void main(String[] args) throws FileNotFoundException 
    { 
    String vowels = "aeiou"; 
    int[] counters = new int[vowels.length()]; 

    Scanner console = new Scanner(System.in); 
    System.out.print("Input file: "); 
    String inputFileName = console.next(); 

    console.useDelimiter(""); 
    while (console.hasNext()) 
    { 

     char ch = console.next().charAt(0); 
     ch = Character.toLowerCase(ch); 
     if(ch == 'a') 
     { 
      counters[0]++; 
     } 
     if(ch == 'e') 
     { 
      counters[1]++; 
     } 
     if(ch == 'i') 
     { 
      counters[2]++; 
     } 
     if(ch == 'o') 
     { 
      counters[3]++; 
     } 
     if(ch == 'u') 
     { 
      counters[4]++; 
     } 
    } 




    for (int i = 0; i < vowels.length(); i++) 
    { 
    System.out.println(vowels.charAt(i) + ": " + counters[i]); 
    } 

    } 
} 

Wenn ich die Dateien ausführen, erkennt es 3 e nur, wenn es einige hundert von beiden erkennen sollte. Ich sehe keine Probleme mit meinem Code, die Probleme verursachen könnten. Ich nehme an, dass es zwischen meinem Begrenzer und Ende der Weile sein muss, weil der Rest aus dem Buch ist.Chars nicht Array-Zähler in While-Schleife erhöhen?

+0

Haben Sie versucht, Putting 'System.out.println (ch);' in der while-Schleife, um zu sehen, ob es das Richtige tut? Das könnte helfen, es herauszufinden. –

+2

Noch wichtiger, haben Sie versucht, 'String term = console.next(); System.out.println (Begriff); ch = term.charAt (0); 'um zu bestimmen, ob dein' useDelimiter (""); 'dir tatsächlich jeweils 1 Zeichen gibt? – AJNeufeld

Antwort

1

Ihr Trennzeichen funktioniert nicht so, wie Sie es für richtig halten. Angenommen, Sie wollten aus der inputFileName lesen, können Sie eine File und Scanner zu tun, um dies zu tun (Denken Sie daran, die Scanner in einem finally Block oder mit einer try-with-resources statement zu schließen). Sie können auch den korrekten counters Index anhand der Position Vokal in vowels ermitteln. Schließlich können Sie formatierte io für die Ausgangsschleife verwenden. So etwas wie,

String vowels = "aeiou"; 
int[] counters = new int[vowels.length()]; 

Scanner console = new Scanner(System.in); 
System.out.print("Input file: "); 
String inputFileName = console.nextLine().trim(); 
try (Scanner scan = new Scanner(new File(inputFileName))) { 
    while (scan.hasNextLine()) { 
     for (char ch : scan.nextLine().toLowerCase().toCharArray()) { 
      int p = vowels.indexOf(ch); 
      if (p >= 0) { 
       counters[p]++; 
      } 
     } 
    } 
} 
for (int i = 0; i < vowels.length(); i++) { 
    System.out.printf("%c: %d%n", vowels.charAt(i), counters[i]); 
} 
0

Es gibt zwei Probleme in Ihrem Code,

  1. Wenn Sie console.next(); verwendet die Eingabe in inputFileName zugewiesen wurde. Das lässt die console mit nur dem Wagenrücklauf (\r\n).
  2. Da Sie new Scanner(System.in) angegeben haben, wartet Ihr Programm auf die Eingabe weiterer Eingaben durch den Benutzer und endet nie. console.hasNext() wird niemals falsch sein.

Was Sie tun können, um es ist, in der while Schleife jedes Zeichen von inputFileName erhalten und dann die Vokal Zahl erhöhen.

Wenn Sie die Eingabe aus einer Datei erhalten wollen, sollten Sie tun

File file = new File(<path to file>); 
Scanner sc = new Scanner(file); 

Dann wird Ihre while-Schleife arbeiten. Und denken Sie daran, nach dem Lesen der Datei die Datei console zu schließen.