• ベストアンサー

compareToメソッドを使って

StringクラスのcompareToメソッドを使って 入力された文字列を昇順に並び替える処理をしたいのですが 1文字ずつ比較し手動で並び替えるというロジックがうまくいきません。 どのようにコーディングすればよいでしょか? どなたかご協力お願いします!

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

  • ベストアンサー
  • kscKane
  • ベストアンサー率62% (18/29)
回答No.4

#1の方に対する補足で思ったことを。 #1補足のようなソースで行くなら、私なら 1.入力文字列を配列にばらして格納する。 2.ばらした配列に対して、ソートをかける。 と言う順番で処理します。 ばらして入れながら同時に並べ替えでは、処理がごちゃごちゃになりそうです。 一つ一つの処理を順番に行っていきましょう。 私が作ったらこんな感じになりました。 思いつくまま作ったので、かなり穴はありそうですが。 public static void main(String[] args) { String s = "13579acegikmoqsuwy02468bdfhjlnprtvxz"; String ss[] = new String[s.length()]; String temp ; for(int i = 0; i < ss.length; i++){ ss[i] = s.substring(i, i+1); } for(int i = 0; i < ss.length; i++){ for(int j = i + 1; j < ss.length; j++){ if(ss[i].compareTo(ss[j]) > 0){ temp = ss[i]; ss[i] = ss[j]; ss[j] = temp; } } } System.out.print("結果:"); for(int i = 0; i < ss.length; i++){ System.out.print(ss[i]); } System.out.println(); }

HANNO
質問者

お礼

一度配列にきちんと格納してから処理をするんですね。 とてもきれいで分かりやすいです! 一度に処理をしようと焦るからダメなんですねー。 勉強になります。本当に助かりました。 ありがとうございました♪

その他の回答 (3)

回答No.3

BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String s = r.readLine(); String ss[] = new String[s.length()];---(6) for(int i = 0; i < ss.length; i++){---(5)  for(int h = i; h < i; h++){---(2)   ss[i] = s.substring(i, i+1);---(3)   ss[h] = s.substring(h, h+1); ---(4)   if(ss[i].compareTo(ss[h]) < 0){ ---(1)    "この部分に入る処理"   } (1)のif分がtrueになるということは、 ss[i]より、ss[h]の方が小さいということになります。 昇順に並び替えるなら、ss[i]とss[h]の”値”を入れ替えなければなりません。 入れ替え用に何かテンポラリの変数を用意しておき、 temp = ss[i];//入れ替え用テンポラリ変数 ss[i] = ss[h]; ss[h] = temp; とすればよいでしょう。 あと、気になったのは、 (2) hの初期値がiと同値なので、同じ値同士を比較するので1回余分かなぁ。 条件が「h < i」なので、(2)のfor文の中には1回も入らないんじゃないかなぁ。 (3)(4) (5)で、「i」が「ss.length-1」の値となったときに(3)(4)に入ると、 「i+1」「h+1」が文字列sの範囲を超えてしまって例外が発生するんじゃないかなぁ。 (6) 1文字ずつしか入れないので、char[]にした良いのでは? (3)(4)の部分はs.charAt(int index)を使って。 (あっ、「StringクラスのcompareToメソッドを使って」という質問でしたね。失礼しました。) です。

HANNO
質問者

お礼

>「i+1」「h+1」が文字列sの範囲を超えてしまって例外が発生するんじゃないかなぁ。 なるほど、確かに! 間違いなく例外発生ですね。 詳しいご指摘ありがとうございました。 自分にとっては難題だったので頭の中がグチャグチャでした・・・ 指摘された部分をきちんと見返して理解に努めます。 またいつかお手伝いよろしくお願いします。

  • kscKane
  • ベストアンサー率62% (18/29)
回答No.2

手動での並べ替えはソートアルゴリズムを使いましょう。 http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/ バブルソートが、動作は遅いですがわかりやすくて現段階ではお勧めです。 こういうところ(ソートの仕方)が分からないのではなかったら申し訳ありません(汗)

HANNO
質問者

お礼

ありがとうございます! 私が聞きたかったのはまさにこれですね! 言葉足らずのまま質問してしまってすみません。。。 早速サイトを参考にさせていただきます。

回答No.1

なにがどう「うまくいかない」のでしょうか? それを提示しないとアドバイスしようがないと思います。

HANNO
質問者

補足

今自分が考えているのは入力された値を配列として取得し そのひとつひとつを比較していくという処理なんですが BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String s = r.readLine(); String ss[] = new String[s.length()]; for(int i = 0; i < ss.length; i++){  for(int h = i; h < i; h++){   ss[i] = s.substring(i, i+1);   ss[h] = s.substring(h, h+1);   if(ss[i].compareTo(ss[h]) < 0){    "この部分に入る処理"   } 上記の部分に加える処理がうまくコーディングできないのです。 というか、そもそもこの配列を使った方法自体 あたっているのかが疑問です。。。

関連するQ&A