【问题标题】:How do you count the amount of numbers when the input is given separated by spaces, ended with a letter?当输入以空格分隔并以字母结尾时,您如何计算数字的数量?
【发布时间】:2017-07-12 14:12:13
【问题描述】:

我对 java 很陌生。 我正在为一个项目尝试一些东西,但我不明白为什么这不起作用。 这里的目标是让用户输入以空格分隔并以字母结尾的数字。然后程序需要计算偶数和奇数索引数并输出总和较大的数。

当给定的数字数量是常数时,我已经成功地做到了这一点,但现在我想让它适应用户输入。 因为我想把数字放在一个数组中,所以我需要知道这个数组的长度。为此,我想计算用户输入的数字数量,以便创建适当的长度数组。

由于某种原因,while 循环没有结束并继续运行。如何计算输入的数字数量?

编辑

我已经添加了 in.next();在第一个 while 循环中,因此它不会卡在第一个输入元素上。然而,这给我带来了另一个问题,即有两个 while 循环试图循环通过相同的输入。我试图创建第二个扫描仪并重置第一个扫描仪,但它没有让第二个循环从第一个元素开始。以前的答案表明这是不可能的,有没有办法把它放在一个while循环中,同时仍然使用数组来存储值?

附:输入值应该可以是任何正整数或负整数。

这是我的完整代码:

import java.util.Scanner;

public class LargerArraySum {

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int length = 0;
    System.out.println("Enter your numbers seperated by spaces, end with a letter");

    while(in.hasNextInt()) {
        length++;
        in.next();
    }
    System.out.println(length);

    int arra[] = new int[length];

    while(in.hasNextInt()) {
        for(int i=0;i<length;i++) {
            int x = in.nextInt();
            arra[i] = x;
        }
    }
    int evenSum = EvenArraySum(arra);
    int oddSum = OddArraySum(arra);

    if(evenSum<oddSum) {
        System.out.println("The sum of the odd indexed elements is bigger");
    } else if(oddSum<evenSum) {
        System.out.println("The sum of the even indexed elements is bigger");
    } else {
        System.out.println("The sum of the odd and even indexed elements is equal");
    }

}
public static int EvenArraySum(int[] a) {
    int sum = 0;
    for(int i=1;i<a.length;i+=2) {
        sum += a[i];
    }
    System.out.println("The sum of the even indexed elements is: " + sum);
    return sum;
}
public static int OddArraySum(int[] a) {
    int sum = 0;
    for(int i=0;i<a.length;i+=2) {
        sum += a[i];
    }
    System.out.println("The sum of the odd indexed elements is: " + sum);
    return sum;
}
}

【问题讨论】:

  • 哪个while 循环继续运行?你有 2 个。
  • 你的while循环没有结束,因为你没有消耗下一个int,所以你总是检查相同的数字。我建议为您的情况使用ArrayList,而不是固定长度的数组。
  • 我提高长度的那个
  • 您可以将您的数字完全读取为一个字符串,并在空格处拆分此字符串并将数字转换为 int。但是如上所述,最好使用 ArrayList。
  • 对所有未来开发工作的一般提示:在 IDE 中调试代码。然后,您可以逐步运行代码并检查所有内容的值。另外,尽量编写易于阅读和理解的代码。

标签: java input while-loop java.util.scanner counting


【解决方案1】:

添加 in.next();在循环。其实你不需要数组。您可以在读取时将偶数和奇数索引数字相加,而无需保存它们。

【讨论】:

  • 但他想像做其他计算一样保留这些数字 - 看看 EvenArraySumOddArraySum。所以in.next() 并没有解决他的问题。
  • 确实如此,他只检查两种方法中输入的索引并创建奇数和偶数的总和。他可以在第一个 while 循环中一起完成所有这些(不存储具体的输入数字)。
【解决方案2】:

1) 你的第一个 while 循环不起作用,因为迭代器总是在同一位置检查更多的数字。

例子:

Position     0 1 2 3 4 5
Value        1 3 5 7 9 0

在开始时,迭代器指向位置 0。如果您调用 hasNextInt(),它将检查位置 1 是否可用,在这种情况下它将为真。此时,interator 仍然指向位置 0。所以你增加你的 length 并再次做同样的事情,所以你有一个无限循环。

要将迭代器移动到下一个位置,您需要调用nextInt()

2) 您不能以这种方式使用第二个 while 循环遍历相同的 Scanner。如果您首先纠正您的 while 循环,迭代器将指向位置 5(它到达扫描仪的末端)。所以hasNextInt()的检查将是假的,第二个while循环不会进入。

3) cmets 已经提到它,您可以像这样使用ArrayList 来表示这个用例:

    final ArrayList<Integer> input = new ArrayList<>();
    while ( in.hasNextInt() ) {
        input.add( in.nextInt() );
    }
    System.out.println( input.size() );

(或者像他的回答中提到的kitxuli,甚至不存储值,只在第一个while循环中计算它们)

【讨论】:

  • 感谢您的回答,nextInt 确实有效,但它确实让我想到了您的第二点。有没有办法让扫描仪从位置一开始?我尝试重置它或创建一个新的扫描仪,但这似乎不起作用。我还没有使用过 ArrayLists,我首先想知道这是否可以通过使用数组来存储来解决,但是 ArrayLists 对我来说似乎是合乎逻辑的下一步。
  • 在我写答案的时候我不确定是否可以将扫描仪重置为从位置 0 开始。现在我可以告诉你,这是不可能的。如果您创建一个新的扫描仪,用户必须再次输入值,这对我来说听起来不是一个解决方案;)
  • 那么在同一日期使用两个while循环不起作用?我尝试使用 Omar 使用空字符串的解决方案,但这仅在使用一位数正数时才有用。有没有办法把它放在一个while循环中,同时仍然使用数组来存储数字?
  • 要创建Array,您需要在初始化时知道​​该数组的大小。您可以询问用户的大小(他想输入的数字数量),或者您可以使用更动态的数据结构,例如ArrayList。如果您不想进一步处理输入值,您也可以直接在第一个 while 循环中创建总和而不存储值。
【解决方案3】:

您的代码有两个主要问题。第一个和第二个 while 循环让我们看看你的第一个循环。

while(in.hasNextInt()) {
    length++;
}

您的条件 in.hasNextInt() 让您插入输入,因为没有使用 in.nextInt 初始化变量,但也返回 [true] 或 [false],因此只要它为 true,它将添加到长度变量而不提示您插入[新输入] .so 代码应该是这样的。

 Int length = 0;
 int k ;
     while(in.hasNextInt()) {
       length++ ;
       k = in.nextInt();
     }

您将输入插入到 ex 的初始化变量 k 中,然后在添加到 [length] 后提示用户进一步输入 k,然后循环将检查您的条件而不提示用户输入。

让我们看看你的第二个 while 循环。

 while(in.hasNextInt()) {
    for(int i=0;i<length;i++) {
        int x = in.nextInt();
        arra[i] = x;
    }
}

in.NextInt() 中,您正在提示用户再次输入新输入,因此您不需要 int x。甚至不需要 while 循环。但是您必须在此示例中声明一个新的扫描仪:我称之为 c。代码应该是这样的。

int [] a = new int [length];
Scanner c = new Scanner (System.in);
for(int i=0;i<length;i++) {
if (c.hasNextInt()){
a[i] = c.nextInt();          
} else
break;
  }

你必须添加if语句,因为如果你在int数组中得到一个字母你会得到一个异常错误。数组a[i]不会提示用户。

当然,让用户输入两次值是不切实际的,因此在不使用 ArrayList 类的情况下实现更好的代码是使用空 String 。

新代码:-

String g = "";
String j ="";
int y ;
int q=0;
int w = 0;
while (in.hasNextInt()) 
    {
   y = in.nextInt();
   g =g+y+",";
   q++;

}
int arra [] = new int [q];

   for(int r =0;r<g.length();r++) {

       if(g.charAt(r)==(',')){
          arra[w]=Integer.parseInt(j);
          System.out.println(arra[w]);
          w++;
          j="";
       }else{
     j=j+g.charAt(r); 
       }

}

另一个更好的代码:-您只需插入以空格分隔的数字,不带字母,按回车键并填充数组。

Scanner in = new Scanner (System.in);
String g = "";
String j ="";
int y ;
int q=0;
int i=0;
int w = 0;

System.out.println("inset your input separated by spaces");  
  g = in.nextLine();

while(i<g.length()){
   if((g.charAt(i))==(' ')){
   q++;
}
i++;
}
 int a [] = new int [q+1];

   for(int r =0;r<g.length();r++) {

       if(g.charAt(r)==(' ')){
          a[w]=Integer.parseInt(j);
          System.out.println(a[w]);
         w++;
          j="";
       }else{
     j=j+g.charAt(r); 
       }


   }
    a[w]=Integer.parseInt(j);
System.out.println(a[w]);   

【讨论】:

  • 感谢您的回答奥马尔。你不想让用户输入两次数字是对的,所以我最感兴趣的是你的最后一部分代码。这只有在我只输入一位数字时才有效,一旦我输入像 21 或 -4 这样的数字,从字符串到数组的转换不会产生我想要的结果。
  • 你说得对,我的代码甚至都不现实,我为你做了一个更好的代码。插入值后插入任何字母,然后它将打印数组。逗号 [','] 将添加到字符串 [g] 中的输入中。数组长度等于您插入数字的实例数量。然后在 for 循环中,它在逗号处停止并填充第一个单元格您的数组通过另一个空字符串 j 等..
猜你喜欢
  • 1970-01-01
  • 2016-03-12
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 2014-08-18
  • 2014-12-05
相关资源
最近更新 更多