• 締切済み

コレクションクラスについて

●下記のコードについて質問があります import java.util.*; public class Test { public static void main(String args[]) { ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne()); list.add(new ObjectOne()); list.add(new ObjectOne()); Collections.sort(list); } } class ObjectOne { private int x = 0; private int y = 0; } このソースをコンパイルすると、 シンボル: メソッド sort(java.util.ArrayList<ObjectOne>) 場所 : java.util.Collections の クラス Collections.sort(list); と、エラーが表示されてしまいます。 java.util.*をインポートしているので、上記のようなエラーはでないと 思うのですが、うまくいかないです。おそらく、ObjectOneクラスで 何か処理漏れが起きているのかもしれませんが、エラーとなる原因を 特定することができません。 エラーとなる原因と解消する手立てを教えていただければと思っております。 宜しくお願い致します。 「追記」 ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); の<ObjectOne>を消せばエラーはなくなりますが、 <ObjectOne>を消さない方針で考えがあればと思っております。

みんなの回答

  • J_H
  • ベストアンサー率57% (11/19)
回答No.4

ANo.1 の補足に対する回答ですが、試行錯誤の残骸です。 意味は、ANo.2 の方の回答どおり、 正しい結果が得られない場合があるのは、ANo.3 の方の回答どおりです。 if (this == oo) return 0; がcompareTo() の先頭にあればなお嬉しいかも。

  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.3

揚げ足取りで申し訳ないのですが。 ↓のコードの場合、oo.xとxの値の差がInteger.MAX_VALUEを超えると正しい順序の比較できません。 >public int compareTo(ObjectOne oo){ >return -oo.x + x; >} 修正後のコードです。 public int compareTo(ObjectOne oo) { if (oo.x == x) return 0; if (oo.x > x) { return -1; } else { return 1; } } 以上。

回答No.2

>「^」の部分になりますが、「-」が付いているのは >どんな意味があるのでしょうか。 return -oo.x + x; っていうのは、つまるところ以下のようにも書けますよね。 return x - oo.x; んでもって、thisが省略されているわけだから。 return this.x - oo.x; 用は、ここでは並べ替えをしているので、「だんだんと大きくなっていくか」はたまた、「だんだんと小さくなっていくか」の違いですね。 反対にしたけりゃ、こっち。 return oo.x - this.x;

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Comparable.html#compareTo(T)
  • J_H
  • ベストアンサー率57% (11/19)
回答No.1

Collections: sort public static <T extends Comparable<? super T>> void sort(List<T> list) となっているので、List<T> の T は Comparable を実装したクラスです。 ObjectOne クラスは、Comparable を実装していないので実装します。 Comparable のメンバメソッド compareTo で、二つのObjectOne を比較する処理を決定します。 以下、若干変えてますの例: import java.util.*; public class Test{ public static void main(String args[]){ ArrayList<ObjectOne> list = new ArrayList<ObjectOne>(); list.add(new ObjectOne(3,1)); list.add(new ObjectOne(2,2)); list.add(new ObjectOne(1,3)); Collections.sort(list); for ( ObjectOne oo : list ){ System.out.println("" + oo ); } } } class ObjectOne implements Comparable<ObjectOne>{ private int x = 0; private int y = 0; public ObjectOne ( int x, int y){ this.x = x; this.y = y; } public String toString(){ return "x = " + x + ", y = " + y; } public int compareTo(ObjectOne oo){ return -oo.x + x; } }

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Collections.html#sort(java.util.List)
KGM
質問者

補足

納得の一言です!! Comparableインタフェースを実装しないとだめなんですね。 一つだけ質問したいことがあります。 public int compareTo(ObjectOne oo){ return -oo.x + x;     ^^^^^ } 「^」の部分になりますが、「-」が付いているのは どんな意味があるのでしょうか。 ご教授の程お願い致します。

関連するQ&A