0

这是我的数组方法的代码:

private int _a;

public static void main(String[] args) {}

public int[] countAll(String s) {
    int[] xArray = new int[27];
    int[] yArray = new int[27];
    _a = (int)'a';

    for (int i = 0; i < xArray.length; i++) {
        xArray[i] = _a;
        _a = _a++;
    }

    for (int j = 0; j < s.length(); j++) {
        s = s.toLowerCase();
        char c = s.charAt(j);
        int g = (int) c;
        int letterindex = g - yArray[0];
        if (letterindex >= 0 && letterindex <= 25) {
            xArray[letterindex]++;
        } else if (letterindex < 0 || letterindex > 25) {
            xArray[26]++;
        }
    }
    return xArray;
}

这段代码在java中工作,但有人告诉我有一种更简单的方法。我在找出我的代码的简化版本时遇到了很多麻烦。请帮我。

4

5 回答 5

2

如果您只想计算大小写,那是一种非常迂回的做法,这样的事情有什么问题:

public static int countUpper(String str)
{
    int upper = 0;
    for(char c : str.toCharArray())
    {
        if(Character.isUpperCase(c))
        {
            upper++;
        }
    }
    return upper;
}

然后只是同样的事情与Character.isLowerCase(c)相反。

于 2013-02-04T06:32:47.477 回答
1
public static int[] countAll(String s) {
    int[] xArray = new int[27];

    for (char c : s.toLowerCase().toCharArray()){
        if (Character.isLetter(c))
            xArray[c -'a']++;
        else
            xArray[26]++;
    }

    return xArray;
}
于 2013-02-04T06:44:17.397 回答
0
public static int[] countAll(String s) {
    int[] count = new int[26];

    for (char c : s.toLowerCase().toCharArray()) {
        if ('a' <= c && c <= 'z') {
            count[c - 'a']++;
        }
    }

    return count;
}

首先..你的阵列哪里大。

其次..为什么你需要两个数组?

第三..您的代码似乎不起作用..单词“hello”返回了一个数字为 97(26 次)和数字为 102 的数组。

编辑:使它更短。

于 2013-02-04T07:51:03.837 回答
0

以下是应该对您的代码进行的两项重要改进:

  • 添加一个方法 javadoc for countAll,这样读者就不必翻阅 20 多行冗长的代码来逆向工程该方法应该是什么。

  • 摆脱_a憎恶。根据最广泛接受的 Java 编码标准,下划线字符在变量名中没有位置。此外,a这是我遇到过的最没用的字段名称。如果它是为了向读者传达一些意义……你完全失去了我。

    (哦,我明白了。它根本不应该是一个字段。Bzzzt !!!)


然后是yArray数组。据我所知,它唯一使用的地方是这里:

int letterindex = g - yArray[0];

这实际上与:

int letterindex = g;

因为yArray[0]从未分配给。总之yArray是完全多余的。


和这个:

    if (letterindex >= 0 && letterindex <= 25) {
        xArray[letterindex]++;
    } else if (letterindex < 0 || letterindex > 25) {
        xArray[26]++;
    }

部分中的条件else是多余的。如果你只写这个,你的代码会更容易阅读:

    if (letterindex >= 0 && letterindex <= 25) {
        xArray[letterindex]++;
    } else {
        xArray[26]++;
    }

两者是等价的。你明白为什么吗?


最后,xArray元素的初始化对我来说显然是错误的。如果xArray包含计数,则元素需要从零开始。(你不知道为什么你的代码告诉你每个字符串都包含很多“zees”吗?)

“这段代码在java中工作......”

我不这么认为。也许它编译。也许它运行而不会崩溃。但它没有给出正确的答案!

于 2013-02-04T06:32:09.337 回答
0

看起来您的程序正在尝试查找字符串中不同字母的频率,并且您正在计算特殊索引 26 中的非字母。在这种情况下,您初始化计数的代码是错误的。它正在以下 for 循环中使用一些值进行预初始化:

for (int i = 0; i < xArray.length; i++) {
        xArray[i] = _a;
        _a = _a++;
    }

我认为该方法可以简单地类似于:

s = s.toLowerCase();
int histogram[] = new int[27];

for (char c: s.toCharArray()) {
    int index = c - 'a';

    if (index < 0 || index > 25) {
        index = 26;
    }

    histogram[index]++;
}
于 2013-02-04T06:43:43.183 回答