2

非常に長い色のリストをHSV/HSB値で並べ替えたいと思っています。色相、土、明るいの順に並べ替えたいと思います。本当に必要なのは、JavaでcompareTo()を作成し、TreeSetを使用して順序付けを行うため、HSVの順序に基づいて1つの色が「前」か「後」かを判断する方法だけです。Javaでは、HSV値はすべてfloatとして格納されます。

私はこれらのようなアルゴリズムがひどいので、どんな助けもいただければ幸いです!

4

1 に答える 1

3

強引な方法:

public final class ColorComparator implements Comparator<Color> {
    @Override
    public int compare(Color c1, Color c2) {
        float[] hsb1 = Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), null);
        float[] hsb2 = Color.RGBtoHSB(c2.getRed(), c2.getGreen(), c2.getBlue(), null);
        if (hsb1[0] < hsb2[0])
            return -1;
        if (hsb1[0] > hsb2[0])
            return 1;
        if (hsb1[1] < hsb2[1])
            return -1;
        if (hsb1[1] > hsb2[1])
            return 1;
        if (hsb1[2] < hsb2[2])
            return -1;
        if (hsb1[2] > hsb2[2])
            return 1;
        return 0;
    }
}

Google Guavaライブラリを使用できる場合、これを行うための非常に簡単で考えられない方法は次のとおりです。

public final class ColorComparator extends Ordering<Color> {
    @Override
    public int compare(Color c1, Color c2) {
        float[] hsb1 = Color.RGBtoHSB(c1.getRed(), c1.getGreen(), c1.getBlue(), null);
        float[] hsb2 = Color.RGBtoHSB(c2.getRed(), c2.getGreen(), c2.getBlue(), null);
        return ComparisonChain.start().compare(hsb1[0], hsb2[0]).compare(hsb1[1], hsb2[1])
            .compare(hsb1[2], hsb2[2]).result();
    }
}

配列をループして比較する(またはGuavaで辞書式順序を使用する)と言いますが、並べ替え順序を変更することをお勧めします。

于 2012-07-25T15:05:34.260 に答える