如何简化这种数组方法?

时间:2013-02-04 06:12:46

标签: java arrays

这是我的数组方法代码:

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,但我被告知有一种更简单的方法。我在查找代码的简化版本时遇到了很多麻烦。请帮我。

5 个答案:

答案 0 :(得分: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)相反的事情恰恰相反。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

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

  • countAll添加方法javadoc,这样读者就不必遍历20多行turgid代码来反向设计应该是什么的方法

  • 摆脱_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 ...”

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

答案 3 :(得分: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]++;
}

答案 4 :(得分: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;
}

首先..你的数组在哪里大。

第二..为什么你需要两个阵列?

第三..你的代码似乎没有工作..“你好”这个词返回一个数字为97(26次)和数字102的数组。

编辑:缩短时间。