我正在尝试找到一种方法来使这个字母计数器运行,并且它必须在letterCounter类中使用数组。我对如何在简洁的地方做到这一点感到困惑。以下是本节给我的说明:
如果 mychar 是小写字母,我们可以在 count 数组中找到相应的位置,使用简单的减法,如下所示:计数[mychar - 'a'](a 是另一个魔术值,您最终希望将其替换为常量。那么大写字母呢?使用静态方法 Character.toLowerCase(mychar)。注意:如果(Character.toLowerCase(mychar) - 'a')计算结果超出范围[0, 25],那么mychar不是字母表中的字母,应该被忽略。因此,您之前添加的 process 方法只是遍历传递的字符串中的字符in,并递增数组中每个字母的值。同样,getCount 方法将字符参数转换为位置并返回计数。确保您了解(并稍后记录)此方法在参数不是字母表中的字母。
这是我的代码:
import java.util.Scanner;
public class CounterDemo
{
public static void main(String[] args)
{
LetterCounter cc = new LetterCounter();
cc.process("foo");
cc.process("supercalafrajalisticexpialadoscious");
cc.process("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");
System.out.println("There are " + cc.getCount('z') + "z's");
}
}
public class LetterCounter {
public int getCount(char letter)
{
// empty method for now
return 0;
}
public void process(String string) {
// TODO Auto-generated method stub
}
}
那么我会只将 0-25 存储在数组中并要求返回字母(如果它在该数组中)吗?
是的,您的解决方案是一个很好的解决方案,因此步骤如下: (伪代码)
字母计数类:- 有数组计数[25]
流程功能:
-
扫描每个字符
-
如果 char -'a' 不是字母:继续
-
count[char - 'a']++(实际上'a'代表97,是ASCII值)
Getcount func
- 返回计数[参数小写 - 'a']
基本的解决方案...您仍然需要仅针对字母字符过滤getCount的结果,但几乎就是这样
public class LetterCounter
{
public LetterCounter()
{
hash = new int[255];
for (int i = 0; i < hash.length(); i++) hash[i] = 0;
}
private int[] hash;
public int getCount(char letter)
{
return hash[(int)letter)];
}
public void process(String string)
{
for (int i = 0; i < string.length(); i++)
{
hash[(int)string.charAt(i)]++;
}
}
}