すべてのカテゴリ » インターネット・パソコン » 技術・プログラミング

質問

終了

javaで質問です。
{"apple", "banana", "lemon"}という配列をソートしたいです。
ただし条件があって、各単語の一番最後の文字列を基準にソートしたいです。
最終的には{"banana", "apple", "lemon"}としたいのですが、どのようにやればできますか?

  • 質問者:匿名希望
  • 質問日時:2009-08-27 22:43:46
  • 0

Comparatorインターフェイスを実装して、自前の比較クラスを作成します。
Arrays.sort()で自前の比較クラスを指定すれば、自由にソートすることができます。

以下がコード例です。

MainClass.java
import java.util.Arrays.sort;
public class MainClass {
public static void main(String[] args) {
String[] srArray = {"apple", "banana", "lemon"};
Arrays.sort(srArray, new MyComparator());
for (int i = 0; i < srArray.length; i++) {
System.out.println(srArray[i]);
}
}

MyComparator.java
import java.util.Comparator;
public class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
StringBuffer sbo1 = new StringBuffer((String)o1);
sbo1.reverse();
StringBuffer sbo2 = new StringBuffer((String)o2);
sbo2.reverse();
return sbo1.toString().compareTo(sbo2.toString());
}
}

  • 回答者:ほほえ (質問から19時間後)
  • 0
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。

並び替え:

Comparatorインタフェースを実装、という所までは豆さんと同じ答えなので省略します。
Comparatorの中の処理について書かせていただきます。

各単語の一番最後の文字(列?)を基準に、というのは、
{"e","a","n"} を {"a","e","n"} にソートしたい、という意味で合ってますか?
例えば、{"lucky", "happy"} のような場合はソートできなくてOKでしょうか。

もし最後の1文字だけの比較でOKなら、
Stringオブジェクトから末尾の1文字を取得して比較する
str.charAt ( str.length( ) - 1 ) ⇒ char で取得する場合
str.substring ( str.length( ) - 1 ) ⇒ Stringで取得する場合

もし、先ほどの{"lucky", "happy"}のような場合もソートしたい場合は、
StringBufferへ値をコピーして、reverse( ) したものを比較する

…といった感じの方法があるかと思います。
うちも今ちょっと環境が揃っておらず、サンプルコードは出せなくてすみません。
また、既に御存知の内容でしたら、失礼をお許しください。
ヒント程度にご活用いただければ幸いです。

===補足===
StringBufferで対応する場合、reverse( ) の戻り値はStringBufferオブジェクトなので、
ほほえさんの回答されている中で、reverseメソッド呼び出し部分をちょっと変えた方が
良いかも知れません。

sbo1.reverse();
sbo2.reverse();

ここは、

sbo1 = sbo1.reverse();
sbo2 = sbo2.reverse();

…だったような気がします。
間違っていたらすみません。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。

このへんを応用できませんか?
http://www.lcv.ne.jp/~kenmio/yomimono/yomimono106.htm

java.util.Comparatorインタフェースの実装クラスを作成すれば、クラス内にソート条件を自由に定義できます。
ソート時に1回使用するだけの使い捨てクラスなので、無名インナークラス(匿名クラス)として定義しておけば、ソース上もあまり邪魔になりません。一度だけ使ったことがありますが、結構便利な方法ですよ。

サンプルコードを書いて提示できればいいのですが、あいにく開発環境がなく動作確認できないためコードが書けません。すみません。
少しでも参考になればいいのですが。

  • 回答者:豆 (質問から10時間後)
  • 0
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。

関連する質問・相談

Sooda!からのお知らせ

一覧を見る