我有这段代码:
public char charCounter(String input){
ArrayList<Character> list = new ArrayList<Character>();
for (Character c : input.toCharArray()) {
list.add(c);
有一种方法可以在输入String中找到最常用的字符而不使用HashMap?
我试图使用:
int max = Collections.max(list.values())
但我不能。
可以帮我一个人吗? 感谢
答案 0 :(得分:1)
你走了:
AbstractFunction
这不区分大小写。您可以稍微调整它以使其区分大小写。
答案 1 :(得分:1)
如果字符集受ANSI限制,可以使用下一种方法。
int
数组
请参阅以下代码:
public static char getMaxFrequencyCharacter(String str) {
int[] occurrences = new int[255];
for (int i = 0; i < str.length(); i++) {
occurrences[str.charAt(i)]++;
}
int max = 0;
char symbol = 0;
for (int i = 0; i < occurrences.length; i++) {
if (occurrences[i] > max) {
max = occurrences[i];
symbol = (char) i;
}
}
return symbol;
}
另请注意,可能有多个字符具有相同的最大频率。 在这种情况下你应该
occurrences[i] == max
答案 2 :(得分:0)
这是一个区分大小写的版本
String word = "hello my name is wombat";
int size = word.length();
int max = 0;
char maxChar = 'a';
for (char x = 'A'; x <= 'z'; x++) {
word = word.replace(String.valueOf(x), "");
int newSize = word.length();
if (size - newSize > max) {
maxChar = x;
max = size - newSize;
}
size = newSize;
}
System.out.println("maxchar is " + maxChar);
答案 3 :(得分:0)
如果需要ArrayList
:在构建ArrayList之后,再次对输入的字符进行循环并使用
Collections.frequency(list, c)
获取每个字符出现次数,如果max较小,则将其置于最大值。
PS。为了使它更“聪明”:-)你可以与你的Set<Character>
并行创建一个list
,使你的输入中包含不同的字符,然后循环遍历该集合以获得Collections.frequency(list, c)
。
或者,您可以仅使用removeAll
方法从列表中删除经过测试的字符,如果您不再需要list
- 最后它将为空。
更新 - 工作代码 - removeAll用法有2个变体 - 一个用于第一个最多字符,第二个用于最后一个,如果有超过2个字符具有相同的出现次数。只要您在方法中创建了list
并且只需要返回大多数字符,就没有理由保持list
不变。无论如何,它在方法结束时消失了。
注意:(我让它们只是静态因为测试我使用的是main - 你不需要这样做) - 选择一个:
public static void main(String... args) {
String input = "This is a simple test string+++++";
System.out.println("charCounterV1First: first most Character: "
+ charCounterV1First(input));
System.out.println("charCounterV1Last: last most Character: "
+ charCounterV1Last(input));
}
public static char charCounterV1First(String input) {
ArrayList<Character> list = new ArrayList<Character>();
for (Character c : input.toCharArray()) {
list.add(c);
}
int max = 0;
Character mostChar = null;
ArrayList<Character> remList = new ArrayList<Character>();
while (list.size() > 0) {
Character nextChar = list.get(0);
int count = Collections.frequency(list, nextChar);
if (count > max) {
max = count;
mostChar = nextChar;
}
remList.clear();
remList.add(nextChar);
list.removeAll(remList);
}
return mostChar;
}
public static char charCounterV1Last(String input) {
ArrayList<Character> list = new ArrayList<Character>();
for (Character c : input.toCharArray()) {
list.add(c);
}
int max = 0;
Character mostChar = null;
ArrayList<Character> remList = new ArrayList<Character>();
while (list.size() > 0) {
Character nextChar = list.get(0);
int count = Collections.frequency(list, nextChar);
if (count >= max) {
max = count;
mostChar = nextChar;
}
remList.clear();
remList.add(nextChar);
list.removeAll(remList);
}
return mostChar;
}
答案 4 :(得分:0)
另一种方法是对字符数组进行排序,然后对其进行迭代以找到最长的连续重复项:
final char[] charArray = input.toCharArray();
java.util.Arrays.sort(charArray);
int maxCount = -1;
char charWithMaxCount = '\0';
int i = 0;
while (i < charArray.length) {
int j = i;
while (j < charArray.length && charArray[j] == charArray[i]) {
++j;
}
if (j - i > maxCount) {
maxCount = j - i;
charWithMaxCount = charArray[i];
}
i = j;
}
// now charWithMaxCount is the desired result