我对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;
}
}
答案 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]);