既存のクラスを変更せずにソートする方法

このQ&Aのポイント
  • Comparatorインタフェースを継承せずに既存のクラスを変更せずにソートする方法について調べてみました。
  • Testclassというクラスを例に考えると、ソートするためにはComparatorインタフェースを実装してソートのルールを定義する必要があります。
  • しかし、既存のクラスを変更せずにソートする方法としては、Collectionsクラスのsortメソッドを使用し、ソートの順番を指定するComparatorオブジェクトを渡す方法があります。
回答を見る
  • ベストアンサー

既存のクラスをソートする方法

下記のようなクラスがありこのクラスのソートを したいのですが、具体的にどのようにすればよいのでしょうか? 調べてみると、Comparatorインタフェースを継承すればソートできるようなのですが、あまり既存のクラスを変更 したくありません。クラスを変更せずにソートする方法 はあるのでしょうか? public class TestClass{ private String[] cbSelItem; private String[] hdSelItemFlg; public String[] getCbSelItem() { return cbSelItem; } public void setCbSelItem(String[] cbSelItem) { this.cbSelItem = cbSelItem; } public String[] getHdSelItemFlg() { return hdSelItemFlg; } public void setHdSelItemFlg(String hdSelItemFlg[]) { this.hdSelItemFlg = hdSelItemFlg; } }

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

補足です。Comparatorは、何か別のクラスに実装すればいいので、 ソートするクラス自体に手を加える必要はありません。 安心してください。 下のコードでは、その「何か別のクラス」に、 無名内部クラスを使っているわけです。 これは、ちゃんと名前の付いた、独立したクラスを 使ったってもちろんかまいません。 ただ一回しか使わないものだし、命名の手間が増えるので、 無名内部を使うと便利だと言うことです。

k-makoto
質問者

お礼

2度もご丁寧なお返事をいただきありがとうございました。 無名内部クラスというのは今まで使ったことがありませんが、ちょっと調べてみて使用してみます。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

Stringの通常の順序でソートするだけなら、 java.util.Arraysのsort(Object[] a)メソッドでできます。 自分の好きな順序でソートしたい場合、 Comparatorを実装する必要が出てきます。 これは、無名内部クラスとして実装すればいいので、 それほど面倒ではないと思います。 と、ここまで書いて思い直したけど、 中のcdSelItemのソートとかじゃなく、このクラス自体を配列にしてソート? そうならやっぱりComparatorを実装する必要があります。 Comparatorは「どっちを先にしますよ」ということを 指定するためのものですから。 使い方は下記を参考にしてください。 import java.util.*; class ComparatorSample{ public static void main(String[] args){ String[] strings = {"abc", "def", "ghi"}; //無名内部クラスを宣言している Comparator comparator = new Comparator(){ //このメソッドで、「どちらが先か」を指定してやる。 //書き方についての注意はComparatorのドキュメントを参考。 public int compare(Object o1, Object o2){ //これは一例。普通の逆順になる。 return o2.hashCode() - o1.hashCode(); } }; for(int i=0; i<strings.length; i++){ System.out.println(strings[i]); } Arrays.sort(strings, comparator); for(int i=0; i<strings.length; i++){ System.out.println(strings[i]); } } }

関連するQ&A

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • インタフェイス実装と抽象クラス継承を同時に使うには??

    私はjava初心者です、今練習問題で困っています。 1つのクラスに抽象クラスとインターフェイスを 実装することはできるのでしょうか? 例えば abstract class Car { private String gas; public void getGas(int gas) { this.gas = gas; } public abstract void enjin(); } interface Flying extends Pet { void show(); } 上のインタフェイスと抽象クラスを同時に下のクラスに継承、実装しよう とすると、どんな風にかけば良いのでしょうか class Zoon { public Zoon() { super(); } public void enjin() { System.out.println("どどどどど"); } public void show() { System.out.println("いいくるまだ"); } }

    • ベストアンサー
    • Java
  • エレメントクラス?

    Javaを勉強しているのですが、 web系で有るJavaBeansのような機能を javaアプリケーソン等でもエレメントクラス?と言って使えるらしいのですが、 どの様に使えばいいのでしょうか、 JavaBeansだと public class 名前{ private String num; public void setNumd(String num)  { this. num= num;  } public String getNum()  {    return this.num; } } この様な構造で、 newしてセットやゲットしいたりすると思いますが(サーブレット上)、 エレメントクラスではどうしたらいいのか分かりません? エレメントクラスの構造は基本構造はJavaBeans(上記)と同じで、 public class 名前{ private String num;  コンストラクタ( String num ) { setNum(num) } コンストラクタ( クラス型 名) { this. num= num; } public void setNumd( String num )  { this. num= num;  } public String getNum()  {    return this.num; } } 上記の様に2つのコンストラクタ追加された構造らしいのですが、 JavaBeansの同じようにnewしてセットやゲットしいようとしてもうまく出来ません? 教えてもらったエレメントクラスで調べても言葉としては出てくるのですが、 詳しい情報がなくセットやゲットしかたや構造が上記の様でいいのか分かりません、 まだ、初歩の初歩までしかやっていないので済みませんが教えて下さい。

  • PHPでサブクラスからスーパクラスのprivate

    メンバにアクセスできる件について PHPでスーパークラスで定義したprivateのメンバにサブクラスからアクセスできる件について 質問です。 class TestClass { private $value01 = "スーパークラスの private メンバ"; public function testMethod01 () { print "スーパークラスのパブリックメソッド"; print "<h1>{$this->value01}</h1>"; } protected function testMethod02(){ print "スーパークラスの protected メソッド"; } private function testMethod03(){ print "スーパークラスの private メソッド"; } public function getMethodList(){ print_r(get_class_methods($this)); } } class ExClass extends TestClass{ private $value01 = "サブクラスの private メンバ"; } $obj = new ExClass(); $obj-> testMethod01(); と上記のようにサブクラスのインスタンスから継承したpublicなメソッド testMethod01()を実行すると スーパークラスのprivateなプロパティにアクセスできてしまいます。 これってどういうことでしょうか?privateメンバってそのクラスの中からだけしかアクセスできませんよね? 上記では、サブクラスからアクセスしているような状態にみえますがどういうことでしょうか? ご教授御願い致します。

    • ベストアンサー
    • PHP
  • Xcodeのクラスについてお聞きします。

    何らかのクラスをつくり、ViewControllerからクラスを生成して そのクラス(以下TestClass)のメソッドにアクセスします。 TestClassのメソッドから呼び出し元のViewControllerの変数若しくはメソッドに アクセスすることはできるのでしょうか? 例) @interface ViewController : UIViewController{ UIlabel *label; //TestClassから書き込みたい } @end @implementation ViewController -(void)viewDidLoad{ TestClass *class = [[TestClass alloc] init]; [class labelWrite];//クラス呼び出し } - (void)hoge{ //TestClassからここにアクセスしたい //処理 } @end @interface TestClass : NSObject @end @implementation TestClass - (void)labelWrite{ //ここからViewControllerのlabelに書き込みたい //もしくはViewControllerのhogeメソッドにアクセスしたい } @end

  • javaプログラムのクラス図など

    「下記のプログラム例のクラス図を描き、プログラム例にはクラス図に対応するブロックにブロックコメントを挿入しなさい。最後にプログラム例でオブジェクト指向の三大要素がどのように実現されているかを説明してください。」 の部分が3週間自分なりに調べたりしたのですが全く分からなく このように質問している恥ずかしい状況です(>_<) 正直言って、明日までの課題です。。。 人生がかかっている言うと大袈裟に聞こえるかもしれないんですが 正直その通りなんです。。。 お力添えしていただける方を探しています。 どうか、お助けください。。。。。。 問題 オブジェクト指向の三大要素についてまとめなさい。次に、下記のプログラム例のクラス図を描き、プログラム例にはクラス図に対応するブロックにブロックコメントを挿入しなさい。最後にプログラム例でオブジェクト指向の三大要素がどのように実現されているかを説明してください。 Animalインタフェース public interface Animal { public abstract void bark(); } ーーーーーーーーーーーーーーー Petインタフェース public interface Pet extends Animal { public String getName(); } ーーーーーーーーーーーーーーー Catクラス class Cat implements Pet { private String name; public Cat(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("ね こ:ニャー"); } } ーーーーーーーーーーーーーーー Dogクラス class Dog implements Pet { private String name; public Dog(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("い ぬ:ワン"); } } ーーーーーーーーーーーーーーーー Duckクラス class Duck implements Pet { private String name; public Duck(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("あひる:ガーガー"); } } ーーーーーーーーーーーーーーーー Frogクラス class Frog implements Pet { private String name; public Frog(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("かえる:ケロケロ"); } } ーーーーーーーーーーーーーーーー PetTestクラス public class PetTest { public static void main (String[] args) { Pet[] pets = {new Cat("タロー"), new Dog("ミケ"), new Frog("ケロ"), new Duck("ドナルド") }; System.out.println(); for(Pet pet: pets) { System.out.printf("\t%8s\t", pet.getName()); pet.bark(); } System.out.println(); } } ーーーーーーーーーーーーーーーーーー 実行結果がこうなります D:\Work >java PetTest タロー ね こ:ニャー ミケ い ぬ:ワン ケロ かえる:ケロケロ ドナルド あひる:ガーガー -- Press any key to exit (Input "c" to continue) -- 上の問題なのですが もし解くことができる方がいましたら お願いします_(._.)_

  • 単方向リストの昇順ソートについて

    単方向リストに値を入れるところまでは何とか切り抜けることができましたが、次はソートにてこずっています。this.value と this.next.valueの値を比べて入れ替えるというところまでは何とか想像つきますが、どうやってソートが完了するまでまわしてあげればいいかが分かりません。 class Chain3{ public static void main(String args[]){ Node start = new Node(Integer.parseInt(args[0])); for(int i = 1; i < args.length; i++){ start.append(Integer.parseInt(args[i])); } start.sort(); } } class Node{ private int value; private Node next; public Node(int value, Node next){ this.value = value; this.next = next; } public Node(int value){ this.value = value; } public Node(){ this.value = 0; this.next = null; } public int getValue(){ return value; } public void setValue(int value){ this.value = value; } public Node getNext(){ return next; } public void setNext(Node n){ this.next = n; } public void append(int v){ if(this.next == null) this.next = new Node(v); else this.next.append(v); } //昇順にソートする public void sort(){ int tmp; /*ここで私はバブルソートで行おうと思っているのだが、どう回数制限していいか分からない*/ if(this.value > this.next.value){ tmp = this.value; this.value = this.next.value; this.next.value = tmp; } this.next.sort(); } }

    • ベストアンサー
    • Java
  • JavaのArrays.sortについて教えてください

     Javaを勉強している初心者です。 次のプログラムはある学校のある学年の梅組の生徒5人のデータ(出席番号 no、氏名 name、身長 height)を 身長の低い順に並べ替えようとするものです。クラスMainでArrays.sort(ume);を実行するとどんな処理が行われるのか、またクラスStudentのメソッドcompareTo(Object o)はどう関係するのかご教示ください。 import java.util.Arrays; class Student implements Comparable { private int no; private String name; private double height; public Student(int no, String name, double height) { this.no = no; this.name = name; this.height = height; } public int compareTo(Object o) { double h1 = this.height; double h2 = ((Student)o).height; if(h1 == h2) { return 0; } else if(h1 > h2) { return 1; } else { return -1; } } } public class Main { public static void main(String[] args) { Student[] ume = new Student[5]; ume[0] = new Student(2, "木下 薫", 141.5); ume[1] = new Student(5, "湯水 敦", 145.0); ume[2] = new Student(1, "相田 徹", 152.5); ume[3] = new Student(4, "田中 大", 136.0); ume[4] = new Student(3, "橋 航", 145.0); Arrays.sort(ume); } }

  • javaのEclipseの問題がわからない

    Human.javaで記述されたクラスを継承し、継承したクラスをインスタンス化して、利用できるHumanクラスのメンバをすべて使用するプログラムを作成せよ。クラス名は、継承したクラスをPerson とし、そのクラスをインスタンス化するクラスをQuestion13_1として、実行結果も記述すること public class Human { private String name = "デフォルトの名前"; protected int age = 22; public int height = 170; final public int weight = 55; public String GetName(){ return name; } public void setName(String name){ this.name = name; } } 結果何を出せば良いのわかりません。

  • 継承について質問させていただきます

    Java初心者です。 privateなフィールドは継承されない と書籍にありましたが、理解に苦しんでおります。 具体例で申しますと、下記コードの cat.setCount(3); です。 CatクラスにはAnimalクラスの変数countは継承されないと考え、 エラーとなることを想像していたのですが。。。 なぜエラーとならないのでしょうか? 宜しければ、解りやすくご説明していただければ幸いです。 どうかよろしくお願いいたします。 ---------------------------------------------- class Animal{ private int count; int getCount(){ return count; } void setCount(int c){ this.count = c; } } class Cat extends Animal{ } public class test{ public static void main(String[] args){ Cat cat = new Cat(); cat.setCount(3); // ここが理解できません System.out.println(cat.getCount()); // ここも同様 } } ----------------------------------------------

    • ベストアンサー
    • Java

専門家に質問してみよう