我只是很难理解我的java类中的类材料

问题描述 投票:-1回答:4

有人可以逐行解释这个代码。我刚开始学习如何编码,我现在正在学习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!

java arrays new-operator
4个回答
0
投票

新的int [10]是什么;

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

在这种情况下,看起来这个数组用于存储与其索引相对应的数字的次数。

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

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

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


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完全一样。


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的建议?经常阅读。谷歌你的每一个小问题,如果你不理解某些东西是如何工作的,那就拿一张纸写出来。


0
投票
int[] repeatedDigits = new int[10];

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

while (x > 0) { 

//提供的整数大于0

int remainder = x % 10;

//获取基数为十的系统中的最小值数字。 101%10 = 1

x = x / 10; 

//在十进制中,这会将数字的大小减少十几个位置。 101/10 = 10为10可以完全分为101 10次。你以这种方式丢弃了数字的最后一位数字。这将允许您退出while循环,因为最终x将等于0。

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

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

您创建的数组的索引为0-9,因为它是十个空格(0,1,2,3,4,5,6,7,8,9)。您将与剩余部分对应的重复数字的索引值分配给之前的任何值加1。

这意味着您发现数字中的最后一位数字等于某个值X.X必须介于0-9之间。由于你有一个索引在0-9之间的数组,你得到与repeatedDigits [X]相关的值,当你找到另一个X值时加一个,并设置repeatedDigits [X]的值等于之前的值你发现这个新的X加一个。

}

int index = 0;

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

while (index < 10) {

遍历数组的值从0到9

if (repeatedDigits[index] != 0)

如果索引处的数组repeatDigits的值不为0.这与输入数字中是否找到索引值相同。

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

index是我们查看的数字。它发生了多少次的计数存储在repeatedDigits [index]中。我们正在打印价值和发生的次数。

index++;

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

    }
}

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,为每个数字打印repeatedDigits数组的值。
  2. 我们从index = 0index = 9运行循环。对于每个值,我们检查是否在输入数字中看到了该数字(即if语句)。我们检查repeatedDigits[index]中的值,看看它是否不等于0。如果是这样,那么我们必须在前一个循环中增加它,所以我们知道该数字在原始输入中至少出现一次。在这种情况下,我们使用System.out.println在控制台上打印一行。然后我们增加index并再次启动循环。

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

© www.soinside.com 2019 - 2024. All rights reserved.