Maison  >  Article  >  Java  >  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 ?

王林
王林avant
2023-05-07 21:46:061569parcourir

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

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

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer