2017-06-17 10 views
0

私はランダムな文字を合計するための良いアルゴリズムがあるかどうか尋ねたいと思います。さCompiler errorどのようにJavaでランダムな文字の配列を合計するには?

私は混乱になり何:

私はここ=

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 

Cmdを上この出力を期待していが、私のソースコードは、=

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] + ", "); 
    } 
} 
} 

ですが、それは私に、このエラーが発生しますcount []配列(13行目)でintをint []に変換できないのに対し、charはkar ​​[]配列のchar []に収まるのはなぜですか?したがって、kar []配列はランダムな小文字を表示するためのものですが、count []配列はkar ​​[]配列が持つすべての文字を集計するためのものです。ところで、ここで

は)(RandomCharacters.getLowercaseのソースコードである - >ライン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'); 
} 
} 

私は本当にあなたが提供することができます任意の助けに感謝。ありがとう。

更新:問題が解決しました。 Mohammed Housseyn Talebに感謝します。 +1してください。

+0

あなたはcountLetterの戻り値の型をint countLetterからint [] countLetter –

+0

に変更する必要があります。実際にはスマートな数学的なaproachがあります。javaの各文字にint値があることを知っていますか?int index = 'a' - 'a'、その場合、値は0に等しいので、配列内でインデックスをインクリメントして、それ以上の必要はありません。26 if文 –

+1

My God ?????本当にありがとうMohammedは本当にストレスリリーフです!ありがとう、ありがとう! –

答えて

0

、あなたはAまたは同じように処理するために、このバージョンを使用することができます

/** 
    * 
    * @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]); 
      } 

     } 
    } 

このコードを試してみてください:については

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; 
} 

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

はあなたの割り当てに自分のコードを適応しようとしています。 –

+0

ええ、私はそれを間違いなく試みます。 Youreは私の問題を解決したばかりでなく、私にも別の解決策を与えてくれました。多くのありがとう男:D –

+0

エゴールケースバージョン:)数学的に –

1

はこのような何かを試してみてくださいあなたの質問:

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

単一のintを返し、それはint[]に変換することはできませんcountLetter()方法...

+0

それもやってみよう。ありがとう。 –

0

あなたは、単に配列インデックスとしてchar値を使用することができます

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

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

それは最速ではありません、それは非常にエレガントです。

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

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

は単に(aための数値)97によってすべての値を超えるシフト、アレイのサイズを小さくする:

int offset = 97; // 97 

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

の値と数量を印刷します
+0

これも試してみるといいですね:D –

0

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)); 
関連する問題