JAva list floatプロパティでソート

35029 ワード

前言
プロジェクトは、クラスのオブジェクトのリストをfloatプロパティの1つに従ってソートする必要があります.ネット上にはクラスのオブジェクトのリストのソートに関するものがたくさんありますが、ソートするには整数または文字列タイプの属性がほとんど見られます.
本文はfloat型属性に従ってソートする方法を解決したが、まだ最高の解決策ではないと感じたので、この記録もレンガを投げて玉を引いて、大物がもっと良い解決方法があることを望んで、また教えてくれることを望んで、感謝に堪えません!
このブログ園の文章は私が参考にしたとても良い文章ですが、残念ながらその比較の属性は整形や文字列型でなければなりません.以下は原文リンクです.本文の引用が多すぎると思ったら、本人に連絡して、できるだけ早く修正してください.おじいさんに敬意を表します!https://www.cnblogs.com/0201zcr/p/5395639.html
Listソートの2つの方法
Java APIは、集合タイプのソートに2つの方法を提供します.
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.util.Comparator)

コレクション内の要素が同じタイプで、Comparableインタフェースが実装されている場合は、最初のメソッドを直接呼び出すことができます.他のソートの考えがある場合は、自然なソートで行いたくない場合は、逆のようなComparatorを伝えることもできます.要素が異なる場合は複雑で、しばらく考えなくてもいいです.
Comparableインタフェースを実装することでlistのソートを実現
現在、パーティクルクラスのリストセットがある場合、Orderプロパティに従ってソートするには、パーティクルクラスにComparableインタフェースを実装し、そのCompareToメソッドを書き換えることができます.具体的には、1)Particleエンティティークラス
public class Particle implements Comparable<Particle> {
    private String name;
    private Integer order;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    
    public Integer getOrder() {
        return order;
    }
 
    public void setOrder(Integer order) {
        this.order = order;
    }

    @Override
    public int compareTo(Person arg0) {
        return this.getOrder().compareTo(arg0.getOrder());  //          。
    }
 
}

ComparableインタフェースのcomparareToメソッドを書き換えることで、上記のコードがorderプロパティに従ってパーティクルを昇順にソートさせるように、プログラムを私たちが望むようにソートすることができます.降順に並べ替えたい場合は、次のようにCompareToメソッドを書き換えることができます.
@Override
    public int compareTo(Person arg0) {
        return arg0.getOrder().compareTo(this.getOrder());  //          。
    }

2)テストクラス
public static void main(String[] args) {
    //     
    List<Particle> listA = new ArrayList<Particle>();
    Person p1 = new Person();
    Person p2 = new Person();
    Person p3 = new Person();
 
    p1.setName("name1");
    p1.setOrder(1);
    p2.setName("name2");
    p2.setOrder(2);
    p3.setName("name3");
    p3.setOrder(3);
    
    //          
    listA.add(p2);
    listA.add(p1);
    listA.add(p3);

    //  
    Collections.sort(listA);

    //      Person
    for (Particle p : listA) {
        System.out.println(p.getName());
    }
}

3)結果:
name1
name2
name3

Collectionsを再ロードする.sortメソッド
javaを直接再ロードします.util.Collections.sort(java.util.List,java.util.Comparator)メソッド.1)Particleクラスは上のクラスと同じですが、Comparableインタフェースは実装されていません.
public class Particle {
    private String name;
    private Integer order;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }

    public Integer getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }
 
}

2)テストクラス
public static void main(String[] args) {
        List<Particle> listA = new ArrayList<Particle>();
        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
 
        p1.setName("name1");
        p1.setOrder(1);
        p2.setName("name2");
        p2.setOrder(2);
        p3.setName("name3");
        p3.setOrder(3);
 
        listA.add(p2);
        listA.add(p1);
        listA.add(p3);
         
        //              
        Collections.sort(listA, new Comparator<Particle>() {
            public int compare(Particle arg0, Particle arg1) {
                return arg0.getOrder().compareTo(arg1.getOrder());
            }
        });
         
        for (Particle p : listA) {
            System.out.println(p.getName());
        }
    }

上から見ると、直接Consllectionsにあります.sort()メソッドでは、Person集合の異なるソートメソッドを異なる場所で使用できるComparatorインタフェースが書き換えられています.上記のようにPersonのorder属性昇順で並べ替えられている場合、私はこのメソッドを書き換えるだけで、他の場所で他のルールで私のlist集合をソートすることができますが、このコードは前の方法より煩雑に見えます.
3)結果
name1
name2
name3

属性がfloat型で比較できない問題
私は上の2つ目の方法でCollectionsを再ロードします.sortメソッドでは、プロジェクトでオブジェクトの重みを大きいものから小さいものにソートする必要があるため、重みがスコア、floatタイプであり、テストクラスのソートルールを直接変更する場合、compareToは2つの浮動小数点数を比較できません.仕方なく他の方法で期待するしかない.以下は私のpersonクラスとテストクラスで、テストクラスの比較方法に重点を置いています.1)Particle類
public class Particle {
    private String name;
    private Integer order;
    private float weight;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }

    public Integer getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }
    
	public float getWeight() {
        return weight;
    }

    public void setWeight(float weight) {
        this.weight = weight;
    }
 
}

2)テストクラス
public static void main(String[] args) {
        List<Particle> listA = new ArrayList<Particle>();
        Particle p1 = new Particle();
        Particle p2 = new Particle();
        Particle p3 = new Particle();

        p1.setName("name1");
        p1.setOrder(1);
        p1.setWeight((float) 0.0000001);
        p2.setName("name2");
        p2.setOrder(2);
        p2.setWeight((float) 0.0000002);
        p3.setName("name3");
        p3.setOrder(3);
        p3.setWeight((float) 0.0000003);

        listA.add(p2);
        listA.add(p1);
        listA.add(p3);

        //              
        Collections.sort(listA, new Comparator<Particle>() {
            public int compare(Particle arg0, Particle arg1) {
                if (arg0.getWeight()>arg1.getWeight()){
                    Log.d("MainAcitity", "    :-1,"
                            +arg0.getWeight()+">"+arg1.getWeight());
                    return -1;
                }else if(arg0.getWeight()<arg1.getWeight()){
                    Log.d("MainAcitity", "    :1,"
                            +arg0.getWeight()+"+arg1.getWeight());
                    return 1;
                }else{
                    return 0;
                }
            }
        });

        for (Particle p : listA) {
            System.out.println(p.getName());
            Log.d("MainAcitity", "    :" + p.getName());

        }
        
}

3)結果
name3
name2
name1

最後に書く
もし誰かもっと良い方法があれば、教えてほしい.