2016-09-22 2 views
0
public static void main(String[] args) { 
    TextIO.putln("Text?"); 
    String line = TextIO.getln(); 
    line = line.toLowerCase(); 
    char[] arr = line.toCharArray(); 
    for(int i = 0; i < line.length(); i++){ 
     if(Character.isLetter(arr[i])){ 
      int count; 
      int j; 
      for(j = 0,count = 0; j < line.length(); j++){; 
       if(arr[i] == arr[j]){ 
        count++; 
       } 
      } 
      System.out.printf("%c:%d\n", arr[i],count); 
     } 

    } 
} 

Wenn ich den Zeichenfolge josh eingeben druckt es aus j: 1 o: 1 s: 1 h: 1 Wenn ich eingeben Joshh druckt j: 1 o: 1 s: 1 h: 2 h: 2 aber ich will j: 1 o: 1 s: 1 h: 2Zählen Brief Frequenzen und Druckbuchstaben: zählen, aber keine Duplikate in Java-Strings

Wie kann ich , für jede Zeichenfolge mit Duplikaten, nur den eindeutigen Buchstaben ausdrucken und wie oft es insgesamt vorkommt? Ich dachte darüber nach, vielleicht eine for-Schleife zu implementieren, die nur für jeden Buchstaben prüft und es für für ('a': string) total ++ erhöht und dann das 'a' um eins erhöht, so würde die nächste Schleife überprüfen, wie viele Vorkommen von b, dann c und so weiter.

+0

Sie können die bereits ausgedruckten Zeichen zu einer Liste hinzufügen und dann prüfen, ob jedes nachfolgende Zeichen mit List.contains (char) in der Liste ist. Wenn die Liste das Zeichen enthält, überspringst du die Zählung und gehst zum nächsten Zeichen. – HomeIsWhereThePcIs

Antwort

0

Wie viel Java kennen Sie? Ist das eine Aufgabe? Hast du Datenstrukturen durchgemacht? Zwei Optionen:

  • sortieren und zählen dann
  • Verwenden Karte (Wörterbuch, wenn Sie von Python kommen als Benutzername schon sagt), Zuwachs im ersten Durchgang und dann durchläuft die Tasten, um die Werte drucken
+0

Intro zu Cs-Klasse, definitiv nicht Datenstrukturen –

0

Versuchen Sie dies.

Map<Character, Integer> map = new LinkedHashMap<>(); 
for (char c : line.toCharArray()) 
    if (Character.isLetter(c)) 
     map.compute(c, (k, v) -> v == null ? 1 : v + 1); 
for (Entry<Character, Integer> e : map.entrySet()) 
    System.out.printf("%c:%d\n", e.getKey(), e.getValue()); 
0
public static void main(String[] args) { 
    TextIO.putln("Text?"); 
    String line = TextIO.getln(); 
    line = line.toLowerCase(); 
    // char[] arr = line.toCharArray(); 
    Map<Character, Integer> occurrences=new LinkedHashMap<Character, Integer>(); 
    for(int i = 0; i < line.length(); i++){ 
     int ch=line.charAt(i); 
     if(Character.isLetter(ch)){ 
      if(occurrences.containsKey(ch)) { 
       occurrences.put(ch, occurrences.get(ch)+1); // increment 
      } 
      else { 
       occurrences.put(ch, 1); 
      } 
     } 
    } 
    for(char ch : occurrences.keySet()) { 
     System.out.print(ch+":"+occurrences.get(ch)+";"); 
    } 
    System.out.println(); 
} 
0

Von dem, was ich sagen kann, es sieht aus wie das Problem in der for-Schleife liegt den Sie verwenden, während des Druckens.

Was passiert ist, dass Sie für jedes einzelne Zeichen in der Zeichenfolge auswerten und drucken. Sobald Sie für die erste h in josh ausgewertet haben, geht Ihr Programm dann weiter zur zweiten h, wertet es erneut aus und druckt h und seine Zählung erneut.

Sie könnten versuchen, eine Datenstruktur wie ein Wörterbuch, das für einzigartige Elemente verantwortlich ist. Wenn Sie zählen, wie oft Buchstaben angezeigt werden, können Sie ein anderes Array verwenden, das bereits gesehene Buchstaben enthält. Wenn Sie gegen dieses Array überprüfen, bevor Sie zählen, wie oft ein Buchstabe angezeigt wird, können Sie sehen, ob der Buchstabe bereits gezählt wurde. Wenn Sie dies tun, können Sie diesen Charakter einfach überspringen und mit dem nächsten fortfahren. Es ist nicht die eleganteste Lösung, aber es würde funktionieren