当输入以空格分隔,以字母结尾时,如何计算数字量?

时间:2017-02-22 13:36:01

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

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

当给定的数字量是常数时,我已经成功完成了这个,但现在我想让它适应用户输入。 因为我想将数字放在数组中,我需要知道这个数组的长度。为了得到这个,我想计算用户输入的数字量,这样我就可以创建适当的长度数组。

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

修改

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

P.S。输入值应该可以是任何正整数或负整数。

这是我的完整代码:

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;
}
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

示例:

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

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

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

2)你不能以这种方式用第二个while循环遍历相同的Scanner。如果你在循环时首先纠正你,迭代器将指向位置5(它到达扫描仪的末尾)。因此,对hasNextInt()的检查将为false,并且不会输入第二个while循环。

3)评论已经提到过,您可以使用ArrayList这样的用例:

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

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

答案 2 :(得分:0)

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

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

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

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

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

让我们看看你的第二次循环。

 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 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]);