数组中的数组?

时间:2017-02-10 01:15:04

标签: java arrays

好吧,因为当我在Java编码的课程中工作时,我被要求使用此代码来计算由字符数组的方法生成的小写字母的实例。我可以遵循代码,直到抛出类似的东西。 “count [chars [currentIndex] - 'a'] ++;”

所以是的,代码说它正在创建一个名为countLetters的公共方法,它需要在主体的某个地方调用,需要一个字符数组参数来启动,得到它。它创建一个名为counts的整数数组,它的大小为26,(与字母表中小写字母的总数#相同,得到它。)然后它会激活一个for数组通常需要的for函数。创建一个名为currentIndex的变量,默认值为0,而当前索引小于chars字符数组的大小做下面的事情。然后它到达for循环实际上是做什么。呃,它到底在做什么?它增加了计数指数的大小?整个事情很奇怪,就像一个数组中的一些数组并减去小写'a'的数值?它正以某种方式修改计数的currentIndex。为什么减去'a'的数值是必要的?不会 - 这里26岁了吗?

有人可以慢慢解释一下,并以完整的外行人的方式说明这是如何运作的?我真的是一个新手程序员,这个东西让我感到困惑,所以请耐心等待,我不是最流行的工具,就像Smashmouth的歌曲一样。除了开玩笑之外,如果你能打破正在发生的事情,我会很感激。

//count the occurrences of each letter
public static int[] countLetters(char[] chars){
//declare and create an array of 26 int 
int[] counts = new int[26];

//for each lowercase letter in the array, count it
 for (int currentIndex = 0; currentIndex < chars.length; currentIndex++)
counts[chars[currentIndex] - 'a']++;

return counts;
}

1 个答案:

答案 0 :(得分:3)

Alrightey所以这一行:

counts[chars[currentIndex] - 'a']++;

所有这一切的简称:

// Get the current character from the array:
char character = chars[currentIndex];

// Characters are just numbers. Check out e.g. an "ASCII table".
// So, let's start treating them like numbers and take 'a' from that.
int indexInCounts = character - 'a';

// Increase the count for that letter:
counts[indexInCounts] = counts[indexInCounts] + 1;

为什么'a'?

阵列从0开始 - 你在你的问题中提到过,所以看起来你到目前为止已经掌握了这些。因此,如果我们想要count [0]来表示输入中的a的数量,那么我们需要将'a'设置为0。

  • 'a' - 'a'为0。
  • 'b' - 'a'是1。

所以,方便的是,从输入字符中删除“a”会给我们一个对我们的数组索引起作用的数字。

字母带走字母是如此奇怪!

计算机只处理数字。拉起an ASCII table,您可以轻松查看字母如何映射到基础数字(在ASCII编码方案中):

  • 97:小写'a'
  • 98:小写'b'
  • 99:小写'c' ..等等!

希望你能看到它的发展方向!

98( b ) - 97( a )为我们提供了索引1,例如。

尝试一下,但不要忘记那些括号!

如果您想进行实验,可以换掉上面的那一行,但不要忘记for循环的括号!

for(int a=...)
    doSomething(); // Only this first line is looped
    doSomethingElse(); // This happens *once*!

这称为隐式括号,也只是一件方便的事情。所以,这是完整的扩展版本:

for (int currentIndex = 0; currentIndex < chars.length; currentIndex++)
{
    // Everything in those brackets will be repeated.

    // Get the current character from the array:
    char character = chars[currentIndex];

    // Characters are just numbers. Check out e.g. an "ASCII table".
    // So, let's start treating them like numbers and take 'a' from that.
    int indexInCounts = character - 'a';

    // Increase the count for that letter:
    counts[indexInCounts] = counts[indexInCounts] + 1;

}

我应该马上写这样的东西吗?

不是,不是!实际上,您通常会从上面看到的扩展版本开始(尽管大多数会立即使用counts[indexInCounts]++;)。当变量仅用于一次时,通常更容易替换实际值 - 就像这样,没有所有这些注释:

char character = chars[currentIndex];

int indexInCounts = character - 'a'; // Character is only used once.

counts[indexInCounts]++; // indexInCounts is only used once.

第2步:

char character = chars[currentIndex];
counts[character - 'a']++; // Character is only used once.

最后,神奇的回归:

counts[chars[currentIndex] - 'a']++;

预测错误

如果你认为自己掌握了它,那么试着预测如果你把一个邪恶的空格字符放入输入中你会得到什么错误。

这是一个剧透:

  

您将获得索引超出范围例外。该ASCII表上的空格 32 32 - 97是一个负数,非常超出counts数组可接受0-25的范围!

P.S。 I'm not the sharpest tool in the shed - 我将永远而且总是不同意(除了关于这首歌;那很棒):)每个人都必须从某个地方开始,你要试一试,所以我祝你一切顺利!