2016-04-16 11 views
0

Ich versuche ein Vigenere Entschlüsselungsprogramm für meine Klasse zu bauen. Die Anweisungen erfordern, dass das Programm für mehrere Sprachen entschlüsseln kann. Also muss ich herausfinden, wie ich über ein Hashset von Strings iterieren und ein Array von Zeichen erstellen kann, die in diesen Strings enthalten sind, sowie die Häufigkeit, mit der jedes Zeichen auftritt. Ich habe es schon eine ganze Weile versucht und nichts, was ich schreibe, funktioniert. `Wie erstellt man ein Array von Zeichen aus einem Hashset von Strings?

public char mostCommonCharln(HashSet<String> dictionary) { 
    for (String s : dictionary) { 
     //what do I write here??? // 
     return Characters; 
    } 
} 
+0

Nach Signatur Ihrer Methode ist es soll nur eine einzige 'char' zurückzukehren. Aus dem Namen der Methode würde ich erraten, dass die Methode das Zeichen mit den meisten Vorkommen in Strings in 'dictionary' zurückgeben soll ?! – dpr

+0

Ja, bitte klären Sie, was Sie von dieser Methode erwarten. – totoro

+0

Vielen Dank für Ihre Antworten. Entschuldigung für Unklarheiten. Die Methode soll jedes Zeichen zurückgeben, das in der Zeichenfolge s gefunden wird, und die Anzahl der Zeichen aufzeichnen. Zum Beispiel würde AABBBCDD A (2) B (3) C (1) D (2) zurückgeben. Ich nehme an, der beste Weg, dies zu tun ist, jedes Vorkommen zu einem Array hinzuzufügen, erreicht dies durch die Iteration über ein Hashset verwirrend mich (HINWEIS - die Kursrichtungen schlagen vor, das for (string s: dictionary) zu verwenden – Ryan

Antwort

1

Ich werde die Unterschrift davon ausgehen, dass Sie wollen, ist:

public static List<CharFrequency> mostCommonChars(Set<String> dictionary) 

Wo CharFrequency Klasse ist definiert als:

class CharFrequency implements { 

    private char value; 
    private int count; 

    public CharFrequency(char v, int c) { 
     this.value = v; 
     this.count = c; 
    } 

    @Override 
    public String toString() { 
     return value + " -> " + count; 
    } 
} 

Und dann werden Sie die folgende Methode haben:

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 
import java.util.List; 
import java.util.stream.Collectors; 
import java.util.function.Function; 

    public static List<CharFrequency> mostCommonChars(Set<String> dictionary) { 
    // Concat all strings present in dictionary into a big string 
    String allchars = dictionary.stream().collect(Collectors.joining()); 
    // Then convert it to a List<Character> which can use Java Streams 
    List<Character> charList = new ArrayList<>(allchars.length()); 
    for (char c : allchars.toCharArray()) { 
     charList.add(c); 
    } 

    final List<CharFrequency> result = new ArrayList<>(); 
    charList.stream() 
      // Group by the char itself and count occurrences 
      .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
      .forEach((character, count1) -> result.add(new CharFrequency(character, count1))); 
    return result; 
} 

Das ist nicht sehr effizient und ich habe es geschrieben, ohne verschiedene Eingaben auszuprobieren, aber es könnte als Start für Sie dienen.

+0

Vielen Dank! Ich werde damit herumspielen (und versuchen, es zu verstehen), dann werde ich posten Sie das Ergebnis in ein Bit – Ryan

+0

Siehe Code Kommentare – marcospereira

+0

Also habe ich einige Teile von dem, was Sie geschrieben haben, und es funktioniert jetzt. Ich habe es aber ein bisschen geändert. Außerdem musste ich eine neue JAR-Datei herunterladen, um Zugriff auf die java.util.stream funktioniert aber am Ende hat das mein Problem gelöst, also vielen Dank an Sie – Ryan

0

Die letzte Antwort:

public char mostCommonCharln(HashSet<String> dictionary){ 
    StringBuilder sb= new StringBuilder(); 
    //String allChars = sb.toString(); 
    String alph = "abcdefghijklmnopqrstuvwxyz"; 
    int[] counts= new int[26]; 
    String allChars =dictionary.stream().collect(Collectors.joining()); 
    for (int k = 0; k<allChars.length();k++){ 
     char ch = Character.toLowerCase(allChars.charAt(k)); 
     int dex = alph.indexOf(ch); 
     if(dex != -1){ 
      counts[dex]+=1; 
     } 
    } 
    int maxDex = 0; 
    for (int i=0;i<counts.length;i++){ 
     if (counts[i]>counts[maxDex]){ 
      maxDex=i; 
     } 
    } 
    char mostFreq=alph.charAt(maxDex); 
    System.out.println (mostFreq); 
    return mostFreq; 
} 
+0

Ist Ihnen bewusst, dass 'char' nicht unbedingt ein lett ist? Oder ist es beabsichtigt, nur die Buchstaben in Ihrem Wörterbuch zu zählen? – dpr

Verwandte Themen