キーの未知の数に基づいて、オブジェクトのリストをソート

canpan14:

私はあなたが入ってくるのキーまたはキーの少なくとも着信番号を知っていれば、その作業罰金オブジェクトのリストをソートする方法をたくさん見てきました。問題は、ユーザが1つのまたは10キーに送信されます場合、私は知らない私の場合です。

現在、私は、各キーの数の巨大なswitch文が、明らかにそのスケールひどくを持っています。それはちょうどチェーン一緒に「thenComparing」の束を。

私は種類のそれのようなルックスができますが、私は、コンパレータの流れを構築する方法を知っていないことをここに例を見つけました。

ハウツーチェーンとコンパレータの流れを適用しますか?

これを行う方法上のギャップを埋めるとなる情報のリンクか、本当に何ピースを探しています。

彼らは同じようにそれを呼ぶだろうユーザー呼び出し側のWebサービスからのこのすべての作品

https://host.com/path?sort=[{"attribute1": "ASC"}, {"attribute2": "DESC"}]
ユージン:

あなたは、このような実体があるとします。

static class Person {
    private final int age;

    private final String name;

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}

あなたはすべてのフィールドを定義し、特定のコンパレータにそれらをマッピングすることができます:

Map<String, Comparator<Person>> map = new HashMap<>();
map.put("name_ASC", Comparator.comparing(Person::getName));
map.put("name_DESC", Comparator.comparing(Person::getName).reversed());

map.put("age_ASC", Comparator.comparingInt(Person::getAge));
map.put("age_DESC", Comparator.comparingInt(Person::getAge).reversed());

そして、あなたの入力を持つ、あなたが行うことができます:

Comparator<Person> all = Stream.of("name_ASC", "age_DESC") // for example
            .map(map::get)
            .reduce(Comparator::thenComparing)
            .orElse((a, b) -> 0); // or whatever you think appropriate

そして、この後にそれらをソートすることは、明らかに非常に簡単ではありません。

 List<Person> persons = List.of(new Person(20, "Bob"), new Person(30, "Rose"));

 // or Collections.sort(persons, all)
 // persons.sort(all)
 persons.stream().sorted(all).collect(Collectors.toList());

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178947&siteId=1