Maison > Java > javaDidacticiel > Quelle est la manière de trier à l'aide de flux et de comparateurs personnalisés dans Java 8 ?

Quelle est la manière de trier à l'aide de flux et de comparateurs personnalisés dans Java 8 ?

王林
Libérer: 2023-05-07 21:46:06
avant
1652 Les gens l'ont consulté

Tri de flux Java8 et comparateur personnalisé

Utilisez la liste de tri de flux Java 8 et le comparateur d'objets personnalisé

La comparaison principale est l'heure, mais l'heure est l'heure la plus récente. La méthode compareto en Java compare le code ACSII, donc 2020 et 2021 sont. certainement 0 est devant, mais ce dont nous avons besoin c'est la dernière date devant, donc nous inversons le résultat renvoyé Normalement, l'heure d'édition de l'objet 1 et l'heure de l'objet 2 sont comparées si l'heure de l'objet 1 est inférieure à celle de. objet 2. le temps renverra 1, nous constaterons donc que 2020 est devant, il suffit d'inverser, car il n'y a que trois résultats de comparaison, l'un vaut 1 par ordre croissant, -1 par ordre décroissant et 0 signifie égal (La classe String implémente l'interface Comparable.

La méthode CompareTo renvoie 0 pour l'égalité, 1 pour l'ordre croissant et -1 pour l'ordre décroissant). Pouvez-vous comprendre pourquoi elle est inversée ici ?

Car après inversion, le 06/09/2021 peut être devant. Vous pouvez trier par heure la plus récente.

如果有的java 8 stream 不懂的可以去看看哦

List<Map<String,Object>> resultList = null;

        Map<String,Object> ss1 = new HashMap<>();
        ss1.put("dictcode","2");
        ss1.put("DictValue","霓虹灯广告1");
        ss1.put("EditTime","2021-09-16 17:47:30");
        Map<String,Object> ss2 = new HashMap<>();
        ss2.put("dictcode","1");
        ss2.put("DictValue","霓虹灯广告2");
        ss2.put("EditTime","2020-04-16 17:47:30");
        Map<String,Object> ss3 = new HashMap<>();
        ss3.put("dictcode","21");
        ss3.put("DictValue","霓虹灯广告3");
        ss3.put("EditTime","2020-09-13 17:47:30");
        Map<String,Object> ss4 = new HashMap<>();
        ss4.put("dictcode","3");
        ss4.put("DictValue","霓虹灯广告4");
        ss4.put("EditTime","2020-09-16 17:47:30");
        Map<String,Object> ss5 = new HashMap<>();
        ss5.put("dictcode","4");
        ss5.put("DictValue","霓虹灯广告5");
        ss5.put("EditTime","2020-09-16 17:47:30");

        List<Map<String, Object>> maps = Arrays.asList(ss1, ss2, ss3, ss5, ss4);

        //默认按edittime排序,如果时间相同或者为空,则按照code排序
        maps.stream().sorted((o1, o2) -> {
            if (StringUtils.isEmpty(o1.get("EditTime").toString()) || StringUtils.isEmpty(o2.get("EditTime").toString())) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else if (o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else
                if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) > 0)
                    return -1;
                 else return 1;
            /*if (StringUtils.isEmpty(o1.get("EditTime").toString())||StringUtils.isEmpty(o2.get("EditTime").toString())
            || o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            }
            else {
               if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) >0)
                   return -1;
               return 1;
            }*/
        }).collect(Collectors.toList()).forEach(System.out::println);
Copier après la connexion

Problème de tri des flux Java

Lors du traitement des données, nous devons souvent trier puis revenir à l'appel frontal. Par exemple, en triant par ordre croissant de temps, les données d'affichage frontal sont triées par temps.

Ici, vous pouvez utiliser la méthode sorted() du flux pour effectuer un tri personnalisé

Parlons de l'utilisation

L'exemple de données ici est une collection de listes, Listlist, il existe de nombreux attributs dans la classe d'entité Data , y compris le champ time ,month, puis lorsque nous utilisons la méthode stream().sorted() pour trier, car les éléments sont de type référence de classe, nous devons personnaliser un comparateur pour trier par mois par ordre croissant.

Le code est le suivant :

list.stream().sorted(Comparator.comparing(o->new Integer(o.getMonth()))).collect(Collectors.toList());
Copier après la connexion

Remarque :

Les paramètres du comparateur utilisent ici l'expression Lambda, new Integer(o.getMonth()). Ce type d'encapsulation dans le type Integer est dû à la classe d'entité Data que nous avons. conçu L'attributmonth est de type String, pas Integer.Il est converti en Integer pour le jugement de parcours du mois suivant. Si l'attribut est Integer Month, la référence de méthode de la classe peut être directement définie dans le comparateur comme suit :

list.stream().sorted(Comparator.comparing(Data::getMonth).collect(Collectors.toList());
Copier après la connexion
.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal