2012-04-12 7 views
0
私はいっぱいで、私のベクトルを注文したい

MyClassのそのような:Comparatorクラスをdouble型のオブジェクトのデータタグに使用するにはどうすればよいですか?

class MyClass 
{ 

double distance; 
String name; 

public void MyClass() 
{} 

} 

そして、私のベクトルは、およそ次のとおりです。私は距離データタグによって私のベクトルの要素を注文したい

MyVector<MyClass>myVector = new MyVector<MyClass>(); 

MyVector.add(myClass1); 
MyVector.add(myClass2); 
MyVector.add(myClass3); 
//Etc.... 

。 私はコンパイラクラスを使用しようとしましたが、失敗しました。誰かがこのケースのために動作するコンパレータクラスを実装できますか?

+1

使用しようとしましたが失敗したコンパレータクラスを表示できますか? –

+0

public int compare(MyClass my1、MyClass m2) \t { \t return(int)(m1.distance - m2.tavolsag); \t} これはいくつかの並べ替えを行いますが、小数点以下のように失敗します。 1.71; 2.32; 3.67; 3.52; 3.98; 4.01 .. ETC –

+0

人々がコンパイラでよく使う「ショートカット」を減算するのは、整数だけでしか動作しません。私は距離とtavolsagは浮動小数点数であり、それらを減算すると浮動小数点数を返すと思います。 floatをintにキャストすると、小数部が削除され、1.5〜1.6のように負の数値(-0.1)が返されます。これは、最初の引数が2番目のLESSよりも小さいことを意味します)は、コンパレータが第1引数が第2引数に等しいと言っていることを意味します)。この場合、ショートカットを使用しないことをお勧めします。コンパレータを以下の回答の1つとして実装してください。 –

答えて

4

これはこれでしたか?さて、いくつかの変更点があります。

List<MyClass> myVector = new Vector<MyClass>(); 

myVector.add(myClass1); 
myVector.add(myClass2); 
myVector.add(myclass3); 


Collections.sort(myVector, new Comparator<MyClass>() { 
    public int compare(MyClass one, MyClass two) { 
     return Double.valueOf(one.getDistance()).compareTo(two.getDistance()); 
    } 
}); 
  1. あなたはインタフェースに対して常にプログラム必要として代入の左辺のListを使用してください。
  2. MyClassにゲッターとセッターメソッドを追加しました。

しかし、もう1つの選択肢は、クラスをComparableにすることです。

class MyClass implements Comparable<MyClass> { 
    private double distance; 
    private String name; 

    @Override 
    public int compareTo(MyClass other) { 
     return Double.valueOf(this.distance).compareTo(other.distance); 
    } 

    ... 
    getters and setters 
    ... 
} 

次に、Collections.sort(myVector)と書くことができます。

1

コンパレータは簡単に実装できます。

public class MyComparator implements Comparator<MyClass> { 

public int compare(MyClass o1, MyClass o2) { 

if(o1.getDistance() > o2.getDistance()) { 
return 1; 
} else if(o1.getDistance() < o2.getDistance()) { 
return -1; 
} 

//they are equal 
return 0; 

} 
} 

次に、あなただけの操作を行います:それは次のようになります

Collection.sort(myVector, new MyComparator()); 

そして、あなたはあなたのベクトルは、次のようなMyClassクラスでコンパレータクラスを定義することができます:)

1

ソートがあります

public static class Comp implements Comparator<MyClass> { 
    public int compareTo(MyClass v1, MyClass v2) { 
     if (v1.distance < v2.distance) { 
      return -1; 
     } else { 
      return v1.distance > v2.distance ? 1 : 0; 
     } 
    } 
} 

次に、単純に並べ替えることができます:

Collections.sort(myVector, new MyClass.Comp());

関連する問題