12

文字列をうまく比較できますが、浮動小数点数をランク付けする方法を知りたいですか?

getChange() は文字列を返します。降順でソートできるようにしたいです。これどうやってするの?

アップデート:

package org.stocktwits.helper;

import java.util.Comparator;

import org.stocktwits.model.Quote;

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        float change1 = Float.valueOf(o1.getChange());
        float change2 = Float.valueOf(o2.getChange());

        if (change1 < change2) return -1;
        if (change1 == change2) return 0; // Fails on NaN however, not sure what you want
        if (change2 > change2) return 1;
    }
}

コンパイル時エラーが発生します:

This method must return a result of type int    ChangeComparator.java   
4

4 に答える 4

18

これはどう:

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        Float change1 = Float.valueOf(o1.getChange());
        Float change2 = Float.valueOf(o2.getChange());
        return change1.compareTo(change2);
    }
}

Java 1.4 が導入されたことに注意してくださいFloat#compare(float, float)(および に相当するものDouble)。これはほとんど直接使用できます。

public class ChangeComparator implements Comparator<Quote>
{
    public int compare(Quote o1, Quote o2) {
        return Float.compare(o1.getChange(), o2.getChange());
    }
}

(編集後、@BorislavGizdov が彼の回答で既にこれについて言及していることに気付きました。)


Comparator#comparing(...)また、Java 8 では、Comparator#comparingDouble(...)これらのコンパレータを直接構築する簡単な方法が提供されていることも注目に値します。

Comparator<Quote> changeComparator = Comparator.comparing(Quote::getChange);

ボックス化されFloatた値を使用して比較します。

Comparator<Quote> changeComparator = Comparator.comparingDouble(Quote::getChange);

float値に昇格された値を使用して比較しdoubleます。

がないことを考えると、これにはボクシングではなくプリミティブ型の変換のみが含まれるため、メソッドComparator#comparingFloat(...)を使用することをお勧めします。comparingDouble(...)

于 2010-09-14T00:32:48.533 に答える
17

Comparator#compare()メソッドの javadoc を読んでください。

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

だから、基本的に

float change1 = o1.getChange();
float change2 = o2.getChange();
if (change1 < change2) return -1;
if (change1 > change2) return 1;
return 0;

または、条件演算子が好きな場合:

return o1.getChange() < o2.getChange() ? -1 
     : o1.getChange() > o2.getChange() ? 1 
     : 0;

ただし、 を考慮に入れる必要がありますFloat.NaN。注文方法がわかりません。初め?最後?同様に?

于 2010-09-14T00:07:11.283 に答える