Javaのオブジェクトの文字列値でソートする方法

私はJava Beanクラスを持っており、これらのBeanのリストをString型の1つのBean属性でソートする必要があります。どうやってやるの?

0
追加された 著者 Kris,

3 答え

Either make the type itself implement Comparable, implementing the compareTo method by comparing the two strings, or implement a Comparator which again compares by the strings.

With the first approach, you'd then just be able to use Collections.sort() directly; with the second you'd use Collections.sort(collection, new FooComparator());

例えば:

public class Foo {
    public String getBar() {
        ...
    }
}

public class FooComparatorByBar implements Comparator {
    public int compare(Foo x, Foo y) {
       //TODO: Handle null values of x, y, x.getBar() and y.getBar(),
       //and consider non-ordinal orderings.
        return x.getBar().compareTo(y.getBar());
    }
}
4
追加された
@スコバル:うん、大きな編集で修正されました。
追加された 著者 Jon Skeet,
それはComparerではなくComparatorでしょうか?
追加された 著者 Mark Pope,

カスタムコンパレータを使用することによって?

import java.util.*;

class Bean {
    public final String name;
    public final int value;

    public Bean(final String name, final int value) {
        this.name = name;
        this.value = value;
    }

    @Override
    public String toString() {
        return name + " = " + value;
    }
}

public class SortByProp {
    private static List initBeans() {
        return new ArrayList(Arrays.asList(
            new Bean("C", 1),
            new Bean("B", 2),
            new Bean("A", 3)
        ));
    }

    private static void sortBeans(List beans) {
        Collections.sort(beans, new Comparator() {
            public int compare(Bean lhs, Bean rhs){ 
                return lhs.name.compareTo(rhs.name);
            }
        });
    }


    public static void main(String[] args) {
        List beans = initBeans();
        sortBeans(beans);
        System.out.println(beans);
    }
}
1
追加された

Guava を使用すると、それだけです

Collections.sort(list, Ordering.natural().compose(Functions.toStringFunction()));
0
追加された