2017-03-27 21 views
0

私はJavaを使い慣れていないため、次の作業に取り掛かります。配列を扱っており、入力に基づいた長さの配列を作成することになっています。 main()以外の方法は使用できません。偶数と奇数にソートされた入力配列

入力配列は0から999までの整数をランダムに選択して配列に入れます。そして、同じ番号と長さを持ち、最初に偶数と奇数でソートされた新しい配列を作成します。

例:これまで

How many variables do you want? 4  

Here are the random variables: 4 7 8 1 
Here are the sorted variables: 4 8 7 1 
Of your chosen variables 2 are even and 2 are odd 

私のコードはこれです。

public static void main(String[] args) 
{ 
    int checker; 
    int even = 0; 
    int odd = 0; 

    Scanner s = new Scanner(System.in); 

    System.out.print("How many variables between 0-999 you want?: "); 

    int n = s.nextInt(); 

    int arr[] = new int[n]; 
    int ord[] = new int[n]; 

    for(int i = 0; i < n; i++) 
    { 
     arr[i] = (int) (Math.random() * 100) + 1; 
    } 

    System.out.print("Here are your random numbers: "); 

    for(int i : arr) 
    { 
     System.out.print(i + " "); 
    } 

    for(int i = 0; i < n - 1; i++) 
    { 
     checker = arr[i] % 2; 

     if(checker == 0) 
     { 
      even = even + 1; 
     } 
     else 
     { 
      odd = odd + 1; 
     } 
    } 

    System.out.print("Of the chosen numbers" + even + "is even and" + odd + "is odd"); 
} 
+1

私は、具体的に何が問題になっているのか、少なくともソートアルゴリズムを試してみるべきだと思います。 – markspace

+0

問題がありますか?あなたの問題はどこですか?あなたが問題のスコープを助けることができれば、はるかにスムーズになります。 –

+0

BTWあなたは、変数が奇妙であるかどうかを確認するためにビット単位でRMBと01を比較できます。 – TheBlueCat

答えて

0

まず、arr[i]=(int)(Math.random()*100)+1;が間違っています。これにより、0〜999の代わりに1〜100の範囲の数値が与えられます。

arr[i]=(int)(Math.random()*1000);

第二に、ループの最後の条件はi<n-1代わりのi<nです:あなたはこのようにそれを記述する必要があります。それも修正する必要があります。

ここで、配列をソートするだけです。偶数と奇数の数を数えるために配列をループしているので、配列を同時にソートすることもできます。

のは、我々は、一時的に値を格納する二つの追加空の配列、偶数用と奇数のための1つ、持ってみましょう:私たち、今、私たちが偶数か奇数を見つけるたびに

int[] evens = new int[n]; 
int[] odds = new int[n]; 

をこれらのアレイの1つにそれらを挿入することができます。

:今

if(checker == 0) { 
    evens[even] = arr[i]; //new line of code 
    even = even + 1; 
} else { 
    odds[odd] = arr[i]; //new line of code 
    odd = odd + 1; 
} 

、私たちがしなければならないすべては、最終的な配列ordに、これら2列に値を挿入することです

これでソートされた配列ができました。私はいくつかの人はそれに私を打つ見るが、私は答えて、とにかくあなたにいくつかの助言を与えるつもりだ

System.out.print("Here are the sorted variables:"); 
for(int i : ord) { 
    System.out.print(i + " "); 
} 
0

は、今あなたがあなたの未ソート配列を印刷だけの方法、それを印刷することができます。

これは最後のforループの後ろに追加するコードです。

int iEven=0;  // the even part starts at the beginning 
    int iOdd=even; // the odd part starts where the even one ends 
    for(int i=0; i<n; i++){ 
     if(arr[i] % 2 == 0){ 
      ord[iEven] = arr[i]; 
      iEven++; 
     }else{ 
      ord[iOdd] = arr[i]; 
      iOdd++; 
     } 
    } 

    System.out.print("\nHere are the sorted variables: "); 
    for(int i:ord){ 
     System.out.print(i+" ");  
    } 

これは、配列の先頭と偶数が終了する偶数を置きます。

また、forループを修正する必要があります: 'for(int i = 0; i < n - 1; i ++)'。 この場合、1回の実行時間は必要以上に短くなります。 どちらかが'私< = N-1'を入れて '私は< N'、または最良のオプションは、「私は<配列を使用することです。長さはであり、配列を変更するたびに変更され、毎回変更する必要はありません。アドバイスを

そして今...このようにコードを書く:

チェッカー=のARR [i]は%2。 (チェッカー== 0)

は次のように改善することができる場合:

IF(ARR [I]%2 == 0)

、それは非常に良く見えます。あなたがを使用しているためそれは少しタイピングを節約し、私は1で、変数を増加させるための(またはi--を)++プログラミングが簡単になります

もう一つ。または、さらに増やしたい場合は、i + = 3またはi- = 7を使用してください。

希望これは

+0

良い答え。しかし、 'i'は既に配列の長さに設定されています。 'n'の代わりに' arr.length'を書いても意味がありません。 – Gendarme

0

を助け最善の解決策は、あなた自身のコンパレータを書くことです: 最初に比較すれば、彼らは1つが偶数と奇数その他の一つです。もしあなたがすでに知っているのであれば、どちらが最初に行なわれるのかを知っています。

Integer ord[] = new Integer[n]; 
Arrays.asList(arr).stream().sorted(new Comparator<Integer>() { 
             @Override 
             public int compare(Integer o1, Integer o2) { 
              if (o1 % 2 == 0 && o2 % 2 == 1) { 
               return -1; 
              } else if (o1 %2 == 1 && o2 % 2 == 0) { 
               return 1; 
              } 
              return o1.compareTo(o2); 
             } 
            }).collect(Collectors.toList()).toArray(ord); 
+1

私はそれを過度に複雑なものと呼んでいます。また、元のポスターは 'main()'以外の方法は許されていないと言っていましたので、私は 'compare()'がここのnogoだと仮定します。 –

0

これは、最終ループを変更することで簡単に行うことができます。キーは、前面からの偶数、背面からの奇数で配列を塗りつぶすことです。完了したら、evenインデックスには偶数がいくつあるかが表示されます。

int even = 0; 
int odd = n-1; 
for(int i = 0; i < n; i++) 
{ 
    checker = arr[i] % 2; 

    if(checker == 0) 
    { 
     // even numbers fill from 0, forward 
     ord[even] = arr[i]; 
     ++even; 
    } 
    else 
    { 
     // odd numbers fill from n-1, backward 
     ord[odd] = arr[i]; 
     --odd; 
    } 
} 

System.out.print("Of the chosen numbers" + even + "is even and" + (n-even) + "is odd"); 
関連する問題