我很难理解我的Java课的课材料

时间:2019-02-13 19:02:24

标签: java arrays new-operator

有人可以逐行解释此代码。我刚刚开始学习如何编码,现在正在学习Java,但是我很难确定该函数的执行方式。 new int[10]是什么?真的吗而我并没有真正的区别,也没有得到repeatedDigits[index]部分与repeatedDigits[remainder]部分的不同用法。

编写一个计算整数x中重复数字的函数。

例如* :如果x为999,则您的函数必须打印回该9 occurs 3 * times。另一个示例,如果整数x为992121,则您的函数*必须打印回该9 occurs 2 times, 2 occurs 2 times and 1 occurs 2 * times。这是该功能的准则。

public static void countRepeatedDigitsInANumber(int x) {

int[] repeatedDigits = new int[10];
while (x > 0) {
int remainder = x % 10;
x = x / 10;
repeatedDigits[remainder] = repeatedDigits[remainder] + 1;

}

int index = 0;
while (index < 10) {

if (repeatedDigits[index] != 0)
    System.out.println("The digit " + index + " occurs " + 
    repeatedDigits[index]);
index++;

    }
}

这是一个可编译的代码。我之所以发布此帖子,是因为我很难理解。如果有人可以提出任何建议来快速学习Java,我将非常感激!

4 个答案:

答案 0 :(得分:0)

  

什么是new int [10];

它将创建一个大小为10的新数组,该数组可以容纳int个值。数组中的所有值都将初始化为0(这正是Java处理int原语的方式)。

在这种情况下,看起来好像使用了此数组来存储与其索引相对应的数字被看到的次数。

嗯,这令人迷惑,但可能更难以阅读,所以让我举一个例子。对于输入992121,您希望程序完成后repeatedDigits数组看起来像这样:

[0, 2, 1, 0, 0, 0, 0, 0, 0, 2]

即两个1,一个2和两个9s


while (x > 0) {

这将启动一个循环,直到x等于(或小于零,但不应发生)为零为止。


int remainder = x % 10;

这实际上是使用模块化算术“捕获”数字的最右边的数字。它将数字除以10,剩下的就是“一位”(即最右边的数字)。


x = x / 10;

这会将数字向右移动一位,并丢弃最右边的数字(因为您已经捕获了它)。


repeatedDigits[remainder] = repeatedDigits[remainder] + 1

这只会增加数组中适当位置的值。例如,如果您仅将9推到数字的右端,这将使repeatDigits [9]中的值递增,因此您知道刚看到了另外的9。


int index = 0;
while (index < 10) {

我们要进行一些循环! (在我看来)有更好的方法可以做到这一点,但这同样有效。基本上,您希望index从0开始,一直循环到9,但在达到10时停止。


if (repeatedDigits[index] != 0)

如果repeatedDigits数组中给定位置的值不为零,则...


System.out.println("The digit " + index + " occurs " + repeatedDigits[index]);

...打印出来!


index++;

最后,增加index,以便我们检查下一个数字。这与index = index + 1完全相同。

答案 1 :(得分:0)

欢迎来到SO和Java的美丽世界!我在整个答案中都附加了超链接,可能会对您有所帮助。

int[] repeatedDigits = new int[10];

上面的代码行是creating an array with 10 elements, from index: 0 to index: 9.

int remainder = x % 10;

上面的代码行正在计算remainder once 'x' has been divided by 10.,例如,如果'x = 9192',则它将除以'9192/10 = 919.2',然后取余数。在这种情况下为“ 2”。请注意,它实际上是如何反向查看数字的?因此,像“ 9192”这样的数字实际上已被处理为“ 2919”。

x = x / 10;

上面的代码行将数字除以10- since it's integer division it drops all decimal values.,因为我们已经计算了最后一个数字。所以我们的“ 9192”现在只是“ 919”。

repeatedDigits[remainder] = repeatedDigits[remainder] + 1;

上面的代码行将转到我们之前存储的剩余值数组的索引。还记得我们的余数是“ 2”吗?它不会索引:在我们的数组中为2,并向其值中添加1-本来是0。所以现在我们在索引:2处的数组具有值:1。这意味着数字2重复了1次。

我在上面布置的只是代码上半部分所在的while循环的1次迭代。因此,拿一张纸,用剩下的数字“ 919”重做我在上面所做的所有事情。

完成后,您应该注意到您的数组看起来像这样:

index 0: 0
index 1: 1
index 2: 1
index 3: 0
index 4 to 8: 0
index 9: 2

这意味着“ 1”出现一次。 “ 2”出现一次。 “ 9”出现了两次。

关于学习Java的建议?时常读书。 Google会询问您的每个小问题,如果您不了解某些工作原理,请写一张纸并将其写出来。

答案 2 :(得分:0)

int[] repeatedDigits = new int[10];

//创建一个大小为10的整数数组

while (x > 0) { 

//而提供的整数大于0

int remainder = x % 10;

//获得以10为基数的系统中的最小值。 101%10 = 1

x = x / 10; 

//以10为基数,这将数字的大小减少了十个位。 101/10 = 10,因为10可以完全分为101 10次。您以这种方式删除了数字的最后一位。这样一来,您就可以退出while循环,因为最终x等于0。

repeatedDigits[remainder] = repeatedDigits[remainder] + 1;

这里的余数可以在0-9之间。这是因为余数是将提供的整数除以10的余数。您不能将大于0的数字除以10且其值小于零或大于9。

您创建的数组的索引为0-9,因为它的长度为10个空格(0、1、2、3、4、5、6、7、8、9)。您正在将重复数字的索引值(对应于您的余数)分配给以前的值加上1。

这意味着您发现数字中的最后一位数字等于某个值X。X必须在0到9之间。当您有一个索引在0到9之间的数组时,您将获得与repeatDigits [X]关联的值,在找到另一个X值后对其添加一个值,并将repeatDigits [X]的值设置为之前的值您找到了这个新的X加一个。

}

int index = 0;

您从数组的第一个值(0)开始

while (index < 10) {

浏览从0到9的数组值

if (repeatedDigits[index] != 0)

如果index处的repeatDigits数组的值不为0。这与说输入数字中是否存在index的值相同。

    System.out.println("The digit " + index + " occurs " + 
    repeatedDigits[index]);

index是我们查看的数字。发生次数的计数存储在repeatDigits [index]中。我们正在打印该值及其出现的次数。

index++;

增加索引,检查下一个索引值。

    }
}

答案 3 :(得分:0)

让我看看是否能为您解决一些问题。我的第一个建议是格式化代码,以使循环中的行缩进:

public static void countRepeatedDigitsInANumber(int x) {

  int[] repeatedDigits = new int[10];
  while (x > 0) {
    int remainder = x % 10;
    x = x / 10;
    repeatedDigits[remainder] = repeatedDigits[remainder] + 1;
  }

  int index = 0;
  while (index < 10) {
    if (repeatedDigits[index] != 0)
      System.out.println("The digit " + index + " occurs " + repeatedDigits[index]);
      index++;
    }
  }
}

这有助于我们查看程序的结构。现在我们可以看到程序运行如下:

  1. 定义新的int数组:int[] repeatedDigits = new int[10];
  2. 运行while循环:while (x > 0) { ... }
  3. 定义一个int变量:int index = 0;
  4. 再次运行包含while语句的ifwhile (index < 10) { if ( ... ) { ... } }

我将尝试一次解释这四个部分。

  1. 首先,我们定义int数组。 new int[10]定义了一个数组,其中有十个斑点,每个斑点可以容纳一个整数。您可以将其想象为彼此相邻的十个框,每个框都标有索引。该数组将用于跟踪我们看到每个整数的次数。 repeatedDigits[0]将保留我们在数字中看到0位的次数; repeatedDigits[6]将保留我们看到的6位数字的次数,依此类推。

  2. 这是程序的核心。我们将分解数字,一次分解一位数字,对于每个数字,我们将一个数字添加到数组中的位置,以跟踪我们看到该数字的次数。此行使我们成为数字中最右边的数字:int remainder = x % 10;%被称为modulo运算符,您可以搜索该运算符以了解更多信息。使用输入992121,这会将remainder分配给1

下一行使用整数除法将数字中的最后一位删除,以便下次通过循环获得下一位。如果x = 992121,则在x = x / 10之后,x将等于99212

最后,我们在repeatedDigits数组中与所看到的数字相对应的位置添加一个。因此,在我们的示例remainder = 1中,所以我们将1添加到repeatedDigits[1]位置。该行利用了以下事实:未初始化的int默认为0

我们已经到达while循环的结尾,因此我们检查条件并找到x > 0,因此再次运行循环。我们对输入数字中的每个数字重复此操作。

艰苦的工作现在已经完成;程序的其余部分在那里可以打印出结果。

  1. 我们将index分配为0。下一个while循环会将此变量从0递增到9,并打印{{1} }每个数字的数组。

  2. 我们从repeatedDigitsindex = 0运行循环。对于每个值,我们检查是否在输入数字(即index = 9语句)中看到该数字。我们检查if中的值是否不等于repeatedDigits[index]。如果是这样,那么我们必须在上一个循环中将其递增,因此我们知道该数字在原始输入中至少出现了一次。在这种情况下,我们使用0在控制台上打印一行。然后我们增加System.out.println并再次开始循环。

如果您有任何疑问,请告诉我,祝您好运!