[英]How to sum up array of random letters in Java?
我想問一下是否有任何好的算法來總結隨機字符。
我期望在Cmd =上輸出
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
這是我的源代碼=
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] + ", ");
}
}
}
但這給了我這個錯誤: 編譯器錯誤
讓我感到困惑的是為什么為什么int無法在count []數組上轉換為int [](在第13行),而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。
試試這個代碼
/**
*
* @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]);
}
}
}
那么您可以使用此版本來處理A或a:
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]++;
}
嘗試這樣的事情:
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;
}
至於你的問題:
//counting every character loop
int[] count = countLetter(kar);
方法countLetter()
返回單個int,並且無法將其轉換為int[]
...
您可以簡單地將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);
}
為了減小陣列大小,只需所有值在由97(數值為移位a
):
int offset = 97; // 97
for(char letter : charArray) {
count[letter - offset]++;
}
這是使用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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.