2016-11-11 4 views
3

私はいくつかの文字列パラメータを持つクラスを持っています。このオブジェクトからインスタンスのリストを作成しました。そして、私はコンパイラのソート機能を使ってリストを別のトピックでソートしました。たとえば、StartTimeまたはEndTimeで指定します。時間は文字列形式で定義されます。ここでは、ソートのための比較関数である:パラメータによるソートとオブジェクト

if (sortType == Sort.STARTTIME){ 
    Collections.sort(routeList, new Comparator<Route>() { 
     @Override 
     public int compare(Route o1, Route o2) { 
      if (Double.parseDouble(o1.getTimeS()) >= (Double.parseDouble(o2.getTimeS()))) 
       return 1; 
      else 
       return -1; 
     } 
    }); 
} 

それは動作しますが、私は>または<または<とコンパレータを変更したときに=が、それは動作しませんサイン!またはendTimeと比較すると、< =としか動作せず、昇順で並べ替えることはできません。私は1と-1の場所を変更することはできません。

if (sortType == Sort.ENDTIME){ 
    Collections.sort(routeList, new Comparator<Route>() { 
    @Override 
    public int compare(Route o1, Route o2) { 
     if ((Double.parseDouble(o1.getTimeE()) <= Double.parseDouble(o2.getTimeE())))) 
      return 1; 
     else 
      return -1; 
    } 
}); 
} 

私は本当にそれで問題があるのか​​分かりません!!!!!!!

public class Route extends Arc { 
    private String type; 
    private int secId; 
    private String tId; 
    private int event; 
    private String name; 
    private String nameS; 
     } 
    private String nameE; 
    private String timeS; 
    private String timeE; 
    ..... 
} 

そして、ここでデータ

57779.999999999985 57779.999999999956 57778.999999999985 57778.99999999994 57778.99999999993 57778.99999999988 57777.0 57777.0 57750.0 57749.99999999994 57734.99999999994 57734.99999999988 57719.999999999985 57719のいくつかの行があります.999999999985

答えて

6

comparatorsのご理解はが間違ってです。

物事が等しいとき、それらは-1,1、およびを返すべきです。したがって、現在の比較は< =を使用し、-1または1のどちらかを返すことは間違っています。

代わりに、というようにロジックを実装する必要があります。

はオーダーのために2つの引数を比較します。最初の引数が2番目の引数よりも小さい、等しい、または大きい場合は、負の整数、ゼロまたは正の整数を返します。

つまり、テストしたデータで最初の実装が有効だった可能性があります。それは間違っています。ロジックを元に戻しても問題は解決しません。

最後に、ここで簡単に答えます。コンパレータ内で単にDouble.compare()を使用してください。浮動小数点数を比較するのは実際には難しいビジネスです。

+0

私はdidnのあなたは何を私に話そうとしていますか? -1 -1? –

+1

@omidgholami彼は-1,1、0を意味しました – janos

+0

ああ、申し訳ありませんが、編集のおかげで。 – GhostCat

0

コンパレータを使用する場合は、比較ロジックを実装します。次のコードで次に

:あなたは基本的にダブルスを比較している

public int compare(Route o1, Route o2) { 
     if (Double.parseDouble(o1.getTimeS()) >= (Double.parseDouble(o2.getTimeS()))) 
      return 1; 
     else 
      return -1; 
    } 

"Double.parseDouble"。他にあなたがコードを改善する必要が

public int compare(Route o1, Route o2) { 
     return o1.type1.compareTo(o2.type1); 
} 

そのTYPE1と仮定すると01の属性とo2がnullになることはありません:あなたは文字列を比較したい場合は、以下のように、あなたはcompareToメソッドを使用することができます。

ポイントは次のとおりです。compareメソッド内で、2つのオブジェクトを比較するロジックを用意する必要があります。あなたはクラスの学生を持っていることを想像:

public class Student { 
    public int id; 
    public String name; 
    public double score; 
    public Student (int id, String name, double score) { 
     this.id = id; 
     this.name = name; 
     this.score = score; 
    } 
} 

そして、2つのインスタンス:

Student foo = new Student(100,"Foo", 10.5); 
Student bar = new Student(50,"Bar", 90.5); 

真で、次のどの目的をソートするために?:

foo > bar 
bar > foo 
foo == bar 

Javaはあなたが必要知っていません論理を提供してください:

IDでご注文いただける場合は、

public int compare(Student s1, Student s2) { 
    return s1.id - s2.id; 
} 

名前で注文するWAT場合:あなたは子孫の方法でスコアで注文するWAT場合

public int compare(Student s1, Student s2) { 
    return s1.name.compareTo(s2.name); 
} 

public int compare(Student s1, Student s2) { 
    return (s2.score - s1.score) * 100; 
} 
0

正しい答え

public int compare(Route o1, Route o2) { 
    if (Double.parseDouble(o1.getTimeS()) < (Double.parseDouble(o2.getTimeS()))) 
     return -1; 
    else if (Double.parseDouble(o1.getTimeS()) == (Double.parseDouble(o2.getTimeS()))) 
     return 0; 
    else 
     return +1; 
    } 
}); 
関連する問題