简体   繁体   English

如何总结Java中的随机字母数组?

[英]How to sum up array of random letters in Java?

I want to ask if there is any good algorithm for sum up a random characters. 我想问一下是否有任何好的算法来总结随机字符。

I'm expecting this output on Cmd = 我期望在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

Here is my source code = 这是我的源代码=

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

But it gives me this error : Compiler error 但这给了我这个错误: 编译器错误

What makes me confuse is why int cannot be converted to int[] on count[] array (on line 13), while char can fit into char[] on kar[] array. 让我感到困惑的是为什么为什么int无法在count []数组上转换为int [](在第13行),而char却可以适合kar []数组上的char []。 So kar[] array is intended for just showing random lowercase letter, whereas count[] array is intended for summing up every characters that kar[] array has. 因此,kar []数组旨在仅显示随机的小写字母,而count []数组旨在总结kar []数组具有的每个字符。

Btw here is the source code for RandomCharacters.getLowercase() --> line 93 : 顺便说一句,这是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');
}
}

I really appreciate any help you can provide. 我非常感谢您可以提供的任何帮助。 Thanks. 谢谢。

UPDATE : PROBLEM SOLVED. 更新:问题已解决。 THANKS to Mohammed Housseyn Taleb. 感谢Mohammed Housseyn Taleb。 +1 for you. 为您+1。

Try this code 试试这个代码

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

        }
    }

then you can use this version to process A or a as the same : 那么您可以使用此版本来处理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]++;
            }

Try something like this: 尝试这样的事情:

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

As for your question: 至于你的问题:

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

The method countLetter() returns a single int, and that cannot be converted to an int[] ... 方法countLetter()返回单个int,并且无法将其转换为int[] ...

You could simply use the char values as array indexes: 您可以简单地将char值用作数组索引:

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

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

It's not the fastest, but it's quite elegant. 它不是最快的,但是非常优雅。


To print the values and quantities: 要打印值和数量:

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

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

To reduce the array size, simply shift all values over by 97 (the numeric value for a ): 为了减小阵列大小,只需所有值在由97(数值为移位a ):

int offset = 97; // 97

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

Here is the solution using Java 8: 这是使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM