2017-06-17 6 views
0

Ich möchte fragen, ob es einen guten Algorithmus für die Zusammenfassung zufälliger Zeichen gibt.Wie fasst man ein Array zufälliger Buchstaben in Java zusammen?

ich diese Ausgabe auf Cmd erwartet =

Random lowercase letters are : 

m k o o b g q l y s z h h n j x b h l a 
p a l x a v z e o w d b y x z o o v u g 
o u l f k k w l s t o s u i r f k c e r 
x i f x y o s e w f h j j c j q v i f g 
q k z n o f j o a g i u t r v a l p o t 

Iteration every characters : 

a : 5, b : 3, c : 2, d : 1, e : 3, f : 6, g : 4, i : 4, j : 5, 
k : 5, l : 6, m : 1, n : 2, o : 11, p : 2, q : 3, r : 3, s : 4, t : 3, 
u : 4, v : 4, w : 3, x : 5, y : 3, z : 4 

Hier ist meine Quellcode =

public class CountRandomLettersArray { 
/** Main method */ 
public static void main(String[] args) { 
    //declare and create an array 
    char[] kar = createArray(); 

    //show lowercase character array 
    System.out.println("Random lowercase letters are : "); 
    System.out.println(); 
    showArray(kar); 

    //counting every character loop 
    int[] count = countLetter(kar); 

//show sum of every character iteration 
System.out.println(); 
System.out.println("Iteration every characters : "); 
System.out.println(); 
showCount(count); 
} 

/** counting every character loop method */ 
public static int[] countLetter(char[] kar) { 
    //declare and create an array that holds 26 of integer data type (26 means sum of 'a' to 'z') 
    int[] count = new int[26]; 

    //count the loop for every lowercase letter in kar[] array 
    for (int i = 0; i < kar.length; i++) { 
     if (kar[i] == 'a') 
      count[0]++; 
     if (kar[i] == 'b') 
      count[1]++; 
     if (kar[i] == 'c') 
      count[2]++; 
     if (kar[i] == 'd') 
      count[3]++; 
     if (kar[i] == 'e') 
      count[4]++; 
     if (kar[i] == 'f') 
      count[5]++; 
     if (kar[i] == 'g') 
      count[6]++; 
     if (kar[i] == 'h') 
      count[7]++; 
     if (kar[i] == 'i') 
      count[8]++; 
     if (kar[i] == 'j') 
      count[9]++; 
     if (kar[i] == 'k') 
      count[10]++; 
     if (kar[i] == 'l') 
      count[11]++; 
     if (kar[i] == 'm') 
      count[12]++; 
     if (kar[i] == 'n') 
      count[13]++; 
     if (kar[i] == 'o') 
      count[14]++; 
     if (kar[i] == 'p') 
      count[15]++; 
     if (kar[i] == 'q') 
      count[16]++; 
     if (kar[i] == 'r') 
      count[17]++; 
     if (kar[i] == 's') 
      count[18]++; 
     if (kar[i] == 't') 
      count[19]++; 
     if (kar[i] == 'u') 
      count[20]++; 
     if (kar[i] == 'v') 
      count[21]++; 
     if (kar[i] == 'w') 
      count[22]++; 
     if (kar[i] == 'x') 
      count[23]++; 
     if (kar[i] == 'y') 
      count[24]++; 
     if (kar[i] == 'z') 
      count[25]++; 
    } 

    return count; 
} 

/** generate a random array of lowercase letters method*/ 
public static char[] createArray() { 
    //declare and create an array of 100 chars 
    char[] kar = new char[100]; 

    //generate lowercase letters 
    for (int i = 0; i < kar.length; i++) 
     kar[i] = RandomCharacters.getLowercase(); 

     return kar; 
} 

/** show characters array method*/ 
public static void showArray (char[] kar) { 
    //shows five lines of lowercase letters 
    final int CHARACTERS_PER_LINE = 20; 
    for (int i = 0; i < kar.length; i++) { 
     if ((i + 1) % CHARACTERS_PER_LINE == 0) 
      System.out.println(kar[i]); 
     else 
      System.out.print(kar[i] + " "); 
    } 
} 


/** show sum of characters iteration method*/ 
public static void showCount(int[] count) { 
final int SUM_OF_CHARACTERS_PER_LINE = 10; 
    for (int i = 0; i < count.length; i++) { 
     if ((i + 1) % SUM_OF_CHARACTERS_PER_LINE == 0) 
      System.out.println((char) (i + 'a') + " : " + count[i] + ", "); 
     else 
      System.out.print((char) (i + 'a') + " : " + count[i] + ", "); 
    } 
} 
} 

Aber es gibt mir diese Fehlermeldung: Compiler error

Was macht mich zu verwirren why int kann nicht in int [] on count [] array (in Zeile 13) konvertiert werden, während char in char [] in kar [] array passen kann. Also ist das Array kar [] nur dazu gedacht, einen zufälligen Kleinbuchstaben anzuzeigen, während das Array count [] dazu dient, alle Zeichen, die das Array kar [] enthält, zu summieren.

Btw hier ist der Quellcode für RandomCharacters.getLowercase() -> Zeile 93:

public class RandomCharacters { 
/** Generate random characters from ch1 to ch2 */ 
public static char getRandomCharacters(char ch1, char ch2) { 
    return (char) (ch1 + Math.random() * (ch2 - ch1 + 1)); 
} 

/** Generate random lowercase letters (this is the method that I used) */ 
public static char getLowercase() { 
    return getRandomCharacters('a', 'z'); 
} 

/** Generate random uppercase letters */ 
public static char getUppercase() { 
    return getRandomCharacters('A', 'Z'); 
} 
} 

Ich schätze wirklich jede Hilfe, die Sie anbieten können. Vielen Dank.

UPDATE: PROBLEM BEHOBEN. DANKE an Mohammed Housseyn Taleb. +1 für dich.

+0

Hallo, Sie müssen den Rückgabetyp von countLetter von int countLetter zu int [] countLetter –

+0

ändern und wirklich gibt es einen intelligenteren mathematischen Ansatz wissen Sie, dass jedes Zeichen in Java einen int-Wert haben, wenn Sie int index = tun 'a' - 'a', in diesem Fall ist der Wert gleich 0, das heißt, in deinem Array musst du den Index inkrementieren und auf diese Weise brauchst du keine weiteren Anweisungen. –

+1

Mein Gott Wie kann ich das vergessen? ????? Gut, danke, Mohammed, du bist wirklich ein Stressabbau! Vielen Dank !! –

Antwort

0

diesen Code Versuchen

/** 
    * 
    * @author Taleb 
    */ 
    public class Counter { 
     static char[] letters; 
     static int[] counts; 
     public static void main(String[] args) { 
      letters = new char[]{'a','a','a','a','a','a','b','b','c','c','c','d','d','d','d','d' 
      ,'d','e','e','f','f','f'}; 
      counts = new int[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 

      for (char letter : letters) { 
       counts[letter-'a']++; 
      } 
      for (int i = 0; i < 26; i++) { 
       char currentChar =(char) ('a'+i); 
       System.out.println(currentChar+" = "+counts[i]); 
      } 

     } 
    } 

dann können Sie diese Version verwenden A oder als gleich zu verarbeiten:

letters = new char[]{'a','A','a','A','a','A','b','B','c','c','C','d','d','F','d','d' 
      ,'d','e','E','f','F','f'}; 
      counts = new int[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 

      for (char letter : letters) { 
       final int index = letter-'A'; 
       counts[index % 32]++; 
      } 
+0

versuche jetzt, meinen Code an deine Aufgabe anzupassen. –

+0

Ja, ich werde das definitiv versuchen. Du hast nicht nur mein Problem gelöst, sondern auch eine andere Lösung. Vielen Dank dude: D –

+0

eine egnore Fallversion :) mathematisch –

1

Versuchen Sie so etwas:

public Map<Character, Integer> count(final char[] text) 
{ 
    final Map<Character, Integer> result = new TreeMap<>(); 
    for (final char c : text) 
    { 
     Integer i = result.get(c); 
     if (null == i) 
      i = 0; 
     result.put(c, i + 1); 
    } 
    return result; 
} 

Was Ihre Frage:

//counting every character loop 
int[] count = countLetter(kar); 

Die Methode countLetter() einen einzigen int zurückgibt, und das nicht zu einem int[] umgewandelt werden kann ...

+0

Okay, werde ich das auch versuchen. Vielen Dank. –

0

Sie einfach die char Werte als Array-Indizes verwenden:

int[] count = new int[...]; //size to support every letter 

for(char letter : charArray) { 
    count[letter]++; 
} 

Es ist nicht die schnellste, aber es ist ziemlich elegant.


Um die Werte und Mengen zu drucken:

for(int i = 0; i < count.length; i++) { 
    char letter = i; 
    int amount = count[i]; 

    System.out.println("There are "+ count +" occurrences of "+ letter); 
} 

die Array-Größe zu reduzieren, einfach alle Werte verschieben über von 97 (den numerischen Wert für a):

int offset = 97; // 97 

for(char letter : charArray) { 
    count[letter - offset]++; 
} 
+0

schön, ich muss das auch versuchen: D –

0

Hier ist die Lösung mit Java 8:

char[] letters = {'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd' 
     , 'd', 'e', 'e', 'f', 'f', 'f'}; 

IntStream.range(0, letters.length) 
     .mapToObj(i -> letters[i]) 
     .collect(Collectors.groupingBy(Function.identity(), TreeMap::new, Collectors.counting())) 
     .forEach((character, count) -> System.out.println(character + " = " + count)); 
Verwandte Themen