2017-02-22 4 views
0

私はかなり新しいJavaです。 私はプロジェクトのためにいくつかのことを試していますが、なぜこれがうまくいかないのか分かりません。 ここでの目標は、スペースで区切られた数字と文字で終わる数字を入力させることです。次に、プログラムは偶数および奇数のインデックス番号を数え、どの合計が大きいかを出力する必要があります。入力がスペースで区切られ、文字で終わったときの数字の数はどのように数えますか?

与えられた数値が定数だったときにすでにこれを成功させましたが、今はユーザー入力に適応させたいと思います。 配列に数値を入れたいので、この配列の長さを知る必要があります。これを得るには、ユーザーが入れる数値の数を数えたいので、適切な長さの配列を作成できます。

何らかの理由でwhileループが終了せず、実行を継続します。どのように数字を入れるのですか?

EDIT

I)は、(in.next追加しました。最初のwhileループでは、最初のinput要素でスタックされません。しかし、これは、2つのwhileループが同じ入力をループしようとしているというさらなる問題を引き起こします。 2番目のスキャナを作成して最初のスキャナをリセットしようとしましたが、2番目のループが最初の要素から開始されません。以前の答えは、これは不可能であることを示していますが、配列を使用して値を格納している間にループ中にこれを置く方法はありますか?

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

どのwhileループが実行を継続しますか?あなたは2を持っています。 – Eabryt

+1

whileループは終了しません。次のintを消費しないので、常に同じ番号をチェックします。固定長の配列の代わりに、あなたのケースに 'ArrayList'を使うことをお勧めします。 – IQV

+0

私は長さを上げるもの – Fiosaurus

答えて

0

追加in.next();ループの中。実際には配列は必要ありません。あなたは偶数と奇数のインデックス番号を保存せずに読んでいる間に合計することができます。

+0

しかし、彼は他の計算をしたように数字を保持したいと思っています - EvenArraySumとOddArraySumを見てください。だから 'in.next()'は彼の問題を解決しません。 – IQV

+0

これは、両方のメソッドで入力のインデックスのみをチェックし、奇数と偶数の合計を作成します。彼は最初のwhileループでこれをすべて実行することができます(具体的な入力番号を保存することなく)。 – SWoeste

0

1)最初のwhileループは、イテレータが常に同じ位置から別の番号をチェックしているため、動作しません。

例:

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

では、あなたがポジション1が利用可能な場合、それはこの場合にはtrueになります、チェックしますhasNextInt()を呼び出した場合は0を配置するイテレータのポイントを開始します。この時点で、インターレーターは依然として位置0を指しています。したがって、lengthを増やして同じことをやり直してください。無限ループになります。

イテレータを次の位置に移動するには、nextInt()に電話する必要があります。

2)同じ方法で2回目のwhileループを使って同じScannerを反復することはできません。 Whileループを最初に修正する場合は、イテレータが5の位置を指します(スキャナの最後に到達しました)。したがって、hasNextInt()のチェックはfalseになり、2番目のwhileループは入力されません。

3)コメントは、すでにあなたがそうのように、このユースケースのためArrayListを使用することができ、それを述べた:

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

(または彼の答えで述べたkitxuliだけでそれらをカウントし、偶数値を格納していけないような最初のwhileループ)

+0

あなたの答えをありがとう、nextIntはうまくいったが、それはあなたの第二のポイントに私をもたらした。スキャナーを1位から始める方法はありますか?私はそれをリセットしたり新しいスキャナを作成しようとしましたが、うまくいかないようでした。私はまだArrayListsで作業していませんが、まずこれを格納するために配列を使って解決できるかどうかを知りたいですが、ArrayListsは論理的な次のステップのようです。 – Fiosaurus

+0

私が書いていた時点で、スキャナーをリセットして位置0から始めることができるかどうかはわかりませんでした。今私はあなたに言うことができます、それは不可能です。新しいスキャナを作成した場合、ユーザは値を再度入力する必要があります。それは私にとって解決策のようには聞こえません;) – SWoeste

+0

同じ日付に2つのwhileループを使用すると期間がありませんか?オマールの空文字列解法を試してみましたが、これは一桁の正の数を使用する場合にのみ有効です。配列を使用して数値を格納しているときにループ中にこれを入れる方法はありませんか? – Fiosaurus

0

コードには2つの大きな問題があります。最初と2番目のwhileループは最初のループを見ています。

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

あなたの条件in.hasNextInt()には変数がin.nextIntで初期化されなかったので、あなたが入力を挿入作られただけでなく、返すのいずれか[真]または[偽]その限りその真のそれは挿入するようにプロンプ​​トを表示せずに長さ変数に追加されます[新しい入力] .soのように見えるはずです。

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

あなたがして、ループがユーザーに入力を求めることなく、あなたの状態をチェックし、[長さ]に追加した後のkへのさらなる入力を促すEXのための初期化変数kに入力を挿入します。

2番目のwhileループを見てみましょう。 in.NextInt()

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

あなたは、この元に新しいスキャナを宣言しなければなりません.Howeverあなたはint型x.Notも、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; 
    } 

あなたはint配列にアルファベットを取得する場合は、例外エラー【選択配列[i]はユーザーにプロンプ​​トを表示しません取得しますので、あなたは、if文を追加する必要があります。

もちろん、ユーザーに値を2回入力させるのは実用的ではないので、よくわからないArrayListクラスを使用せずに実装する方が良いコードは、空のStringを使用することです。

NEW CODE: -

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

} 

別の、より良いコード: - あなたはただの文字なしスペースで区切っあなたの数字を挿入し、Enterキーを押し、配列が満たされています。

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

あなたの答えはオマールありがとうございます。ユーザーが数字を2回入力することを望まないことは正しいので、コードの最後の部分にはほとんど興味があります。これは、私が21または-4のような数字を入力すると、一桁の数字だけを入力すると動作しますが、文字列から配列への変換では望みのものが得られません。 – Fiosaurus

+0

あなたは私のコードが現実的ではなかったのは間違いありません。値を挿入した後に任意の文字を挿入すると、配列が印刷されます。コンマ['、']が文字列[g]の入力に追加されます。配列の長さは、数字を挿入したインスタンスの数に等しくなります。forループでは、コンマで停止し、別の空のString jなどを使用して配列を作成します。 –

関連する問題