有问题的方法如下。该方法应该采用字符串并使用bag adt返回项目的频率。我有它工作,但是如果我(例如)输入“test”,它将显示输出T,S和T及其各自(尽管是正确的)频率。但是,我希望输出只是T,S的频率。
public int getFrequency(String str){
int index=0;
char[] nArray = new char[sArray.length];
for(int i=0;i<sArray.length; i++){
char a = sArray[i];
String s = Character.toString(a);
index = consonants.getFrequencyOf(s);
if(index != 0 && consonants.contains(s)==true){
for(int x=0;x<nArray.length;x++){
if(nArray[i] == sArray[x]){
continue;
}
else{
System.out.print(s + ": ");
System.out.println(index);
nArray[i] = sArray[i];
break;
}
}
}
}
return index;
}
答案 0 :(得分:0)
您应该使用HashMap
来存储字符及其对应频率: -
public Map<Character, Integer> getFrequency(String str){
String vowels = "aeiouAEIOU";
Map<Character, Integer> freqMap = new HashMap<Character, Integer>();
for(int i=0;i<str.length(); i++) {
char ch = str.charAt(i);
// If character is a not consonant.. continue with next iteration
if (vowels.contains(ch)) {
continue;
}
Integer val = freqMap.get(ch);
if (val != null) {
// Put new entry in Map.. With character and count = 1
} else {
// Increment val by 1, and update the map for this character
}
}
return freqMap;
}
只需确认您的代码: -
index = consonants.getFrequencyOf(s);
if(index != 0 && consonants.contains(s)==true){
第二个条件对我来说很模糊。因为如果index !=0
,则表示consonants
包含s
..那为什么要再次检查?
或者,你的getFrequencyOf(s)
正在做其他事情,而不是检查遏制,我们看不到?
答案 1 :(得分:0)
我认为问题出在else-block中。无论如何你都会得到它。但是你只需要在循环结束时才能获得它。您应该像这样重写内部循环:
public int getFrequency(String str){
char[] sArray = str.toCharArray();
char[] nArray = new char[sArray.length];
int[] fArray = new int[sArray.length];
for(int i=0; i < sArray.length; i++){
char a = sArray[i];
String s = Character.toString(a);
if(consonants.contains(s)==true){
for(int x=0; x <= i; x++){
if(nArray[x] == sArray[i]){
fArray[x]++;
break;
}
if (x == i){
nArray[i] = sArray[i];
fArray[i] = 1;
}
}
}
}
for (int k = 0; k < fArray.length; ++k){
if (nArray[k] == 0){
continue;
}
System.out.println(String.valueOf(sArray[k]) + ": " + String.valueOf(fArray[k]));
}
return fArray[fArray.length - 1];
}