• ベストアンサー

配列

最後にもう一つだけお願いします。ずっと格闘しても解決できません・・ 配列の中の数字で、偶数を全て奇数の前にもって行きます 例) {1,0,1,0,0,1,1} → {0,0,0,1,1,1,1} {3,3,2} → {2,3,3} {2,2,2} → {2,2,2} 流れとしては、まず奇数の数を数えます。これは何回シフトするから知るためです。 配列0から奇数を探し、あればそれを一番最後の配列へとシフトします。 奇数を探す作業が一度終わっても、まだシフトさせないといけない奇数があるかもしれないので(奇数が連続で並んでる場合)、最初に数えた奇数の数分だけちゃんとシフトするようにしようと思います。 public void evensLeft(int[] array) { int odd=0; for (int i = 0; i < array.length; i++) { if(array[i]%2!=0) odd++; //奇数の個数 } while (odd>0) { //奇数分シフトするためのカウント for(int j=0;j<array.length;j++){ //奇数を探す if (array[j] % 2 != 0) { odd--; //奇数のカウントを1減らす for (int k = j; k < array.length-1; k++) { //その奇数を一番最後に移動 int temp = array[k+1]; array[k+1] = array[k]; array[k] = temp; } } } } return array; } いくつかの例では動くのですが、{3,3,2}の例だと配列0に3が来てしまいます。色々変えてみても結果無理でした・・・ どなたかご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • isi0611
  • ベストアンサー率34% (46/134)
回答No.5

お疲れ様です。 No.4さんのおっしゃるように、まず偶数、奇数に分けた方が やりやすいかと思います。 ArrayListというクラスでaddAllというメソッドがあり、リストの末尾に、指定されたすべての要素を追加できます。 なので、まず1つ目のArrayListに偶数を、次に2つ目のArrayListに奇数を、そして偶数リストにaddAllで奇数リストをつけてやればきれいにできるかと思いますよ。 参考までに public void evensLeft(int[] array) { ArrayList<Integer> gusu = new ArrayList<Integer>(); ArrayList<Integer> kisu = new ArrayList<Integer>(); for (int i = 0; i < array.length; i++) { if (array[i] %2 == 0) { gusu.add(new Integer(array[i])); } else { kisu.add(new Integer(array[i])); } } gusu.addAll(kisu); for (int i = 0; i < gusu.size(); i++) { array[i] = (gusu.get(i)).intValue(); } }

lockwell
質問者

お礼

先ほどNo.4さんのおっしゃっていたArrayListを調べていたのですが、isi0611さんの例でArrayListのやり方がわかりました! 非常に参考になりました!ありがとうございます! 今JAVAの問題を解く練習をしているので、またわからないところがあったら質問させてください。 皆さん本当にありがとうございました!

その他の回答 (4)

  • yuji
  • ベストアンサー率37% (64/169)
回答No.4

マージソートみたいに、2つの配列に分けて、それを最後に1つにまとめてみては? ただし、配列だと今回みたいに個数が不定の場合に操作しずらいので Listを使うのがいいかと思います。 1)奇数用のArrayList, 偶数用のArrayListを用意する。 2)forループを使い、元の配列を走査して、  奇数だったら奇数用のArrayListに追加、偶数だったら偶数用のArrayListに追加。 3)結果用の配列を用意する。 4)forループを使い、偶数用のArrayList,奇数用のArrayListの順に  結果用の配列に入れていく。

lockwell
質問者

お礼

あぁなるほど。確かにあらかじめ分けたいものをわけといたほうがいいですね。ありがとうござます!

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

while (odd>0) { //奇数分シフトするためのカウント   for(int j=0; odd > 0; j++){ //奇数を探す     if (array[j] % 2 != 0) {       odd--; //奇数のカウントを1減らす       //その奇数を一番最後に移動       int tmp = array[j];       for (int k = j+1; k < array.length; k++) {        array[k-1] = array[k];       }       array[ array.length - 1] = tmp;       // 入れ替えをしたのでもう一度検査       j--;     }   } }

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

あなたはよっぽど 配列の要素の隣同士の入れ替えが好きなのね。 同じサイズの新しい配列を用意して そこにはめ込んでいく方が楽でしょうに。 {3,3,2}だとわかりにくいから{3,5,2}で表現するけど あなたのように隣同志を入れ替えると {5,2,3}になっちゃうのよね。 最初に3と5を入れ替えて 次に参照するインデックスが1だから 先頭に来てしまった5がもう相手されなくなってしまうわけ。 新しい配列を用意してあげれば 元の配列を頭から参照して行って 偶数なら頭から、奇数なら途中(偶数の数)から埋めていけばいいだけ。 なぜか知らないけど あなたはいろいろ難しく考えすぎている。 (ずどどーん:荒木飛呂彦的効果音)

lockwell
質問者

お礼

そうなのです。ずっと頭で隣同士でやると思い込んでいました・・・ そのせいで奇数が連続しいるケースで困っていたのです・・・。 これからは必要な時は新しく配列を定義してやっていこうと思います。ありがとうございました!

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>配列の中の数字で、偶数を全て奇数の前にもって行きます 単純に「偶数」<「奇数」とするような「比較演算子」を定義して Arrays.sort() に渡せばいいような気がしますけど

関連するQ&A