所以我在java中有一个程序,它从用户输入中获取一个字符串,对其进行排序,查找频率,然后按字母顺序打印。我唯一的问题是它也打印重复。因此,如果字母d在字符串中出现三次,它将打印如下:
d freq:3
d freq:3
d freq:3
对于这个项目,我不允许使用任何内置 java排序函数(包括hashmaps)。关于如何阻止这个的任何建议?这是我的代码。谢谢!
char[] charArray = userSort.toCharArray();
char tempChar;
for (int i = 0; i < charArray.length; i++) {
for (int j = 0; j < charArray.length; j++) {
if (charArray[i] < charArray[j]) {
tempChar = charArray[i];
charArray[i] = charArray[j];
charArray[j] = tempChar;
}
}
}
String sortedString = "";
for (int i = 0; i < charArray.length; i++) {
userSort += charArray[i];
}
System.out.println(sortedString + "\n");
int counter;
sortedString = "";
for (int i = 0; i < charArray.length; i++) {
counter = 0;
for (int j = 0; j < charArray.length; j++) {
if (charArray[i] == charArray[j]) {
counter++;
}
}
if (!sortedString.contains("Char: " + charArray[i])) {
if (sortedString.equals("")) {
sortedString += " " + charArray[i] + " freq: " + counter + "\n";
} else {
sortedString += " " + charArray[i] + " freq: " + counter + "\n";
}
}
}
System.out.println(sortedString);
答案 0 :(得分:1)
您可以使用TreeMap<Character, Integer>
来保存已排序的字符顺序以及计算字母频率。
Map<Character, Integer> freqs = new TreeMap<>();
for (char c : charArray.length) {
freqs.put(c, 1+freqs.getOrDefault(c, 0));
}
您也不需要对输入字符串进行排序。 (特别是不使用冒泡排序)。迭代字符并添加/更新到地图将创建订单。
答案 1 :(得分:1)
确保i!= 0。 将charArray [i]与charArray [i-1]进行比较。 如果它们不相等,则打印出结果。
答案 2 :(得分:0)
解决方案:在没有hashmap和排序的情况下更新:
ALGO: 1.创建26个字母的临时数组并输入频率计数.i.e
0-> a,
1-> b....
2.迭代数组以打印结果
public static void countFrequency(){
String user = "Harshal";
user = user.toLowerCase();
char ch[]= user.toCharArray();
int arr[] = new int[26];
for(char c : ch){
arr[c-97]++;
}
for(int k=0;k<26;k++){
if(arr[k]!=0){
int val = k+97;
System.out.println((char)val + " freq: " + arr[k]);
}
}
}
答案 3 :(得分:0)
您需要做的是Bucket Sort
简而言之,创建一个长度为26的int数组,它代表26个字符(让我们称之为&#34;计数器数组&#34;
循环你的字符串。对于遇到的每个字符,在计数器数组中递增相应的int。
在循环输入字符串后,计数器数组将包含26个字符中每个字符的出现次数
其余应该是直截了当的我相信,你只需要通过计数器数组循环并打印相应的输出
Spoiler ahead:示例代码。如果您还没有尝试编写代码,请不要阅读
String input = "The quick brown fox jumps over a lazy dog"; int[] counter = new int[26]; for (char c : input.toLowerCase().toCharArray()) { if (c >= 'a' && c <= 'z') { counter[c-'a']++; } } for (int i = 0; i < counter.length; ++i) { System.out.println("" + (char)('a' + i) + " occurs " + counter[i] + " times"); }