2013-02-04 56 views
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编写,但有人告诉我,有一个简单的方法。我在计算我的代码的简化版本时遇到了很多麻烦。请帮帮我。

+5

如果你告诉我们它会做什么会有所帮助。 –

+2

对于一件事'_a = _a ++;'与'_a ++相同;' –

+1

另一件事,你是否需要在for循环中每次调用它:“s = s.toLowerCase();” – mike01010

回答

0

下面是应使你的代码中有两处重要改进:

  • 添加一个方法的Javadoc 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 ......”

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

+0

@StephenC ..您还可能指出将'_a ++'的结果重新分配给'_a'的副作用。 –

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

为什么要用'Character.isLetter'检查?这只是多余的。 –

+0

我认为OP要为每个字母计数,而不仅仅是一个计数。 – Dukeling

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]++; 
} 
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; 
} 
+0

你会得到一个数组索引越界。所有越界角色必须放置在索引26(从我能说的)。可以肯定的是转换为'int'是不必要的。 – Dukeling

+0

你是对的,修好了。 –

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; 
} 

首先..你的阵列,其中大。

第二..你为什么需要两个数组呢?

三..你的代码没有seemt工作..单词“hello”返回数组数97(26倍)和数字102

编辑:制造更短。