Java “理解”;查找最大占用字符“;在字符串算法中

Java “理解”;查找最大占用字符“;在字符串算法中,java,arrays,algorithm,kotlin,ascii,Java,Arrays,Algorithm,Kotlin,Ascii,我正在学习数据结构和算法,我有一个小问题,就是理解查找字符串中哪个字符最多的过程 我了解总体目标-拥有一个表示特定字符计数的数组,我显然了解如何在数组中查找max,但我对这段代码(代码来自: 所以它基本上告诉我“给我索引“t”的值”?我怎么能用字符搜索我应该用索引搜索的地方 同样在kotlin中,我得到的期望值(count[str.get(I)])是int,而不是char 我可能错过了阻止我理解这一点的基本概念,但在短时间的谷歌搜索后,我没有找到多少。Java将把char转换成int,例如,根据

我正在学习数据结构和算法,我有一个小问题,就是理解查找字符串中哪个字符最多的过程

我了解总体目标-拥有一个表示特定字符计数的数组,我显然了解如何在数组中查找max,但我对这段代码(代码来自:

所以它基本上告诉我“给我索引“t”的值”?我怎么能用字符搜索我应该用索引搜索的地方

同样在kotlin中,我得到的期望值(
count[str.get(I)]
)是int,而不是char


我可能错过了阻止我理解这一点的基本概念,但在短时间的谷歌搜索后,我没有找到多少。Java将把
char
转换成
int
,例如,根据
ASCII
表,将'A'转换为
65

只要
字符串
不包含返回值大于
255的字符(例如,
“€”
),一个
256
位置的数组就足以将可能的
char
映射到数组位置。例如,对于英语字母表来说,这就足够了。然而,由于Java中的char是
2字节
(16位),因此大小为
65536
(2^16)的数组就足够安全了。 您还可以从该字符串上存在的所有字符(假设为非null或空字符串)计算
max
int
值,并相应地分配数组:

int count[] = new int[str.chars().max().orElse(0)+1];
回到你的问题:

count[some_char]++
some_char
转换为
int
,并在相应的数组
count
位置上增加一个值

您可以将此过程视为一个简单的散列函数,将“char”映射到“int”,尽管它很简单,但它非常适合当前的问题,因为它唯一地将给定的char映射到该数组上的某个位置

我正在初始化计数数组以保存整数,但在for循环中我 搜索字符串中的特定字符,例如:

count["t"]++
计数[“t”]++ 所以它基本上告诉我“给我指数的值 “t”?我怎么能用chararter搜索我应该搜索的地方呢 索引

请注意,
count[“t”]+
会给您一个编译错误,函数
str.charAt(i)
返回一个
char
,而不是
字符串,因此是“t”而不是“t”

一个运行示例:

import java.util.Arrays;
import java.util.stream.Collectors;

public class FindMaximumOccurringChar {

    private static int[] countChar(String str) {
        int[] count = new int[str.chars().max().orElse(0) + 1];
        for (int i = 0; i< str.length(); i++)
            count[str.charAt(i)]++;
        return count;
    }

    public static void main(String[] args) {
        String str = "miaumiauuuuu";
        int[] count = countChar(str);
        String str_without_duplicated_char = Arrays.stream(str.split(""))
                .distinct()
                .collect(Collectors.joining());

        for (int i=0; i<str_without_duplicated_char.length(); i++){
            System.out.println("The char '"+str_without_duplicated_char.charAt(i)+"' shows up "
                    + count[str_without_duplicated_char.charAt(i)] +" times");
        }
    }
}

基本上,
count[str.charAt(i)]++
,存储输入字符串中每个字符的计数。Java将每个字符索引转换为ASCII值

let say str = "abca";

For each iteration : 
count['a'] = 1; or count[97] = 1;  a has ascii value 97
count['b'] = 1; or count[98] = 1;  b has ascii value 98
count['c'] = 1; or count[99] = 1;  c has ascii value 99
count['a'] = 2; or count[97] = 2;
The char 'm' shows up 2 times
The char 'i' shows up 2 times
The char 'a' shows up 2 times
The char 'u' shows up 6 times
let say str = "abca";

For each iteration : 
count['a'] = 1; or count[97] = 1;  a has ascii value 97
count['b'] = 1; or count[98] = 1;  b has ascii value 98
count['c'] = 1; or count[99] = 1;  c has ascii value 99
count['a'] = 2; or count[97] = 2;