Trier une liste d'objets basée sur un nombre inconnu de clés

canpan14:

Je l'ai vu beaucoup de façons de trier une liste d'objets qui fonctionnent bien si vous connaissez les clés entrants ou au moins le nombre d'entrée de clés. Le problème est dans mon cas, je ne sais pas si l'utilisateur envoie en 1 ou 10 touches.

À l'heure actuelle, j'ai des instructions switch géant pour chaque nombre de touches, mais il est évident que les échelles terriblement. Il seulement des chaînes un groupe de « thenComparing » ensemble.

J'ai trouvé un exemple ici qui ressemble à ce genre de aide, mais je ne sais pas comment construire un flux de comparateurs.

Comment à chaîne et appliquer un flux de comparateurs?

Vous cherchez un lien ou quoi que ce soit vraiment des éléments d'information qui permettra de combler les lacunes sur la façon de le faire.

Tout cela fonctionne à partir d'un appel utilisateur webservice où ils appelleraient comme

https://host.com/path?sort=[{"attribute1": "ASC"}, {"attribute2": "DESC"}]
Eugène :

Supposons que vous ayez une telle entité:

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;
    }
}

Vous pouvez définir tous les champs et la carte à ceux d'un certain comparateur:

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());

Et puis avoir votre entrée, vous pouvez le faire:

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

Et les trier après ce qui est évidemment une évidence:

 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());

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=178948&siteId=1
conseillé
Classement