アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

どなたかご協力お願いします!

A 回答 (4件)

なにがどう「うまくいかない」のでしょうか?


それを提示しないとアドバイスしようがないと思います。

この回答への補足

今自分が考えているのは入力された値を配列として取得し
そのひとつひとつを比較していくという処理なんですが
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){
   "この部分に入る処理"
  }

上記の部分に加える処理がうまくコーディングできないのです。
というか、そもそもこの配列を使った方法自体
あたっているのかが疑問です。。。

補足日時:2006/10/23 15:39
    • good
    • 0

手動での並べ替えはソートアルゴリズムを使いましょう。


http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/al …
バブルソートが、動作は遅いですがわかりやすくて現段階ではお勧めです。

こういうところ(ソートの仕方)が分からないのではなかったら申し訳ありません(汗)
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/23 15:50

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メソッドを使って」という質問でしたね。失礼しました。)

です。
    • good
    • 0
この回答へのお礼

>「i+1」「h+1」が文字列sの範囲を超えてしまって例外が発生するんじゃないかなぁ。

なるほど、確かに!
間違いなく例外発生ですね。
詳しいご指摘ありがとうございました。
自分にとっては難題だったので頭の中がグチャグチャでした・・・
指摘された部分をきちんと見返して理解に努めます。
またいつかお手伝いよろしくお願いします。

お礼日時:2006/10/23 16:48

#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();
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/23 16:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!