Java 数组中的数组?

Java 数组中的数组?,java,arrays,Java,Arrays,好的,当我在Java编码的课程中慢慢学习时,我被要求使用这段代码来计算由字符数组的方法生成的小写字母的实例。我可以跟踪代码直到它抛出类似的东西。“计数[字符[currentIndex]-'a']++;” 是的,代码说它正在生成一个名为countLetters的公共方法,它需要在主体的某个地方调用,需要一个字符数组参数来启动,明白了吗。它创建一个名为counts的整数数组,其大小为26(与字母表中小写字母的总数相同,明白了)。然后它启动一个for函数,该函数通常用于数组。创建一个名为current

好的,当我在Java编码的课程中慢慢学习时,我被要求使用这段代码来计算由字符数组的方法生成的小写字母的实例。我可以跟踪代码直到它抛出类似的东西。“计数[字符[currentIndex]-'a']++;”

是的,代码说它正在生成一个名为countLetters的公共方法,它需要在主体的某个地方调用,需要一个字符数组参数来启动,明白了吗。它创建一个名为counts的整数数组,其大小为26(与字母表中小写字母的总数相同,明白了)。然后它启动一个for函数,该函数通常用于数组。创建一个名为currentIndex的变量,默认值为0,而当前索引小于字符数组的大小。请执行以下操作。然后它得到for循环实际在做什么。它到底在干什么?它增加了count索引的大小?整个事情都很奇怪,比如数组中的某个数组减去小写字母“a”的数值?它正在以某种方式修改计数的当前索引。为什么需要减去“a”的数值?在这里-26不够吗

有人能用通俗易懂的语言慢慢解释一下这是怎么回事吗?我充其量只是一个新手程序员,这些东西让我很困惑,所以请容忍我,我并不是棚里最锋利的工具,就像《斯马什茅斯之歌》所说的那样。别开玩笑了,如果你能告诉我发生了什么,我将不胜感激

//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;
}
//计算每个字母的出现次数
公共静态int[]countLetters(char[]chars){
//声明并创建一个26 int的数组
int[]计数=新的int[26];
//对数组中的每个小写字母进行计数
对于(int currentIndex=0;currentIndex
好的,这一行:

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开始-您在问题中提到了这一点,因此到目前为止,您似乎已经掌握了这些数组的窍门。因此,如果我们希望计数[0]表示输入中a的数量,那么我们需要将“a”设置为0

  • “a”-“a”是0
  • “b”-“a”是1
等等

因此,从输入字符中去掉“a”可以方便地得到一个对数组索引非常有用的数字

信把信拿走真奇怪! 计算机实际上只处理数字。向上拉,您可以轻松查看字母如何映射到基础数字(在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;

}
步骤2:

char character = chars[currentIndex];
counts[character - 'a']++; // Character is only used once.
最后,神奇的台词又回来了:

counts[chars[currentIndex] - 'a']++;
预测误差 如果你认为你已经掌握了诀窍,那么试着预测如果你把一个邪恶的空格字符扔进输入中会出现什么错误

这是一个扰流器:

您将得到一个索引超出范围的异常。那个ASCII表上的空格是32
32-97
是一个非常负的数字,并且非常超出
计数的可接受的0-25范围
数组


顺便说一句,我不是棚里最锋利的工具,我永远也永远不会同意(除了那首歌;那太棒了):)每个人都必须从某个地方开始,你正在尝试,所以我祝你一切顺利

再加上这个结局:如果你不发光,你就永远不会发光!谢谢,这真的很有帮助。看到一个数组引用另一个数组索引值有点奇怪。不过,据我所知,counts通过从chars数组的currentIndex值中提取字符来计算它将添加1的索引,然后减去'a'的数值,即97。这一切都会产生一个舒适精确的数组集,用于计数,阻止掉在小写字母范围之外的字符。谢谢你的技术,我现在觉得有点傻,哈。@Strom一点问题都没有!希望您能顺便看到所有内容(我编辑了几次答案-刷新或检查顶部的小“编辑答案-单击刷新”按钮)。是的,我感谢您花了这么多时间来安排所有内容!与现实生活中的概念相比,编码对我来说总是更容易掌握。我之前的一个问题是理解for语句中的for语句,两者都有9次迭代。有人把它描述为一个大齿轮(第一个用于转动一次),第二个齿轮(第二个用于转动九次)。我个人认为这样的描述在帮助理解一个概念方面最有帮助,并且可以将代码分解成更小的步骤,这是您能够做到的,因此非常感谢和有帮助@Strom啊,这是一个有趣的类比-我以前从未听说过for循环被描述为cog-我最近建议,例如,多次复制/粘贴代码以“解开”循环,使其更真实-我很高兴它有帮助!)
counts[chars[currentIndex] - 'a']++;