こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

●下記のコードについて質問があります

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>を消さない方針で考えがあればと思っております。

投稿日時 - 2007-07-29 20:42:00

QNo.3210246

KGM

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

J_H

ANo.1 の補足に対する回答ですが、試行錯誤の残骸です。
意味は、ANo.2 の方の回答どおり、
正しい結果が得られない場合があるのは、ANo.3 の方の回答どおりです。

if (this == oo) return 0;

がcompareTo() の先頭にあればなお嬉しいかも。

投稿日時 - 2007-08-14 08:33:21

ANo.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;
}
}
以上。

投稿日時 - 2007-08-05 05:58:39

>「^」の部分になりますが、「-」が付いているのは
>どんな意味があるのでしょうか。

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)

投稿日時 - 2007-07-31 00:09:07

ANo.1

J_H

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)

投稿日時 - 2007-07-29 21:48:17

補足

納得の一言です!!
Comparableインタフェースを実装しないとだめなんですね。
一つだけ質問したいことがあります。

public int compareTo(ObjectOne oo){
return -oo.x + x;
    ^^^^^
}

「^」の部分になりますが、「-」が付いているのは
どんな意味があるのでしょうか。
ご教授の程お願い致します。

投稿日時 - 2007-07-29 23:03:08

あなたにオススメの質問