ホームページ  >  記事  >  Java  >  Java 8 でストリームとカスタム コンパレータを使用して並べ替える方法は何ですか?

Java 8 でストリームとカスタム コンパレータを使用して並べ替える方法は何ですか?

王林
王林転載
2023-05-07 21:46:061566ブラウズ

java8 ストリーム ソートとカスタム コンパレータ

Java 8 ストリーム ソート LIst とカスタム オブジェクト コンパレータを使用します

主な比較は時間ですが、時間は最新の時間です。Java での比較 The ACSIIメソッド比較のコードなので、2020 と 2021 は先頭に 0 でなければなりませんが、必要なのは先頭に最新の日付があるため、返された結果を反転します。通常、オブジェクト 1 の編集時刻はオブジェクト 2 の時刻と比較されます。オブジェクト 1 の時間がオブジェクト 2 の時間より小さい場合、1 が返されます。したがって、2020 が前であることがわかります。compareto の結果は 3 つしかないため、反転するだけで済みます。1 つは 1 です。昇順、降順で -1、および 0 が等しいことを意味します (String クラスは Comparable インターフェイスを実装します。

CompareTo メソッドは、等しい場合は 0、昇順の場合は 1、降順の場合は -1 を返します)。なぜここで反転しているかわかりますか?

反転後は、2021-09-06 が前になる可能性があるためです。最新の時刻で並べ替えることができます。

如果有的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);

Java ストリームのソートの問題

データを処理するとき、多くの場合、データをソートしてからフロントエンド呼び出しに返す必要があります。たとえば、時間の昇順にソートすると、フロントエンド表示データは時間順にソートされます。

ここでは、カスタマイズされた並べ替えを実行するためにストリームのsorted()メソッドを使用できます

使用法について話しましょう

ここでのサンプルデータはリストコレクション、List

コードは次のとおりです:

list.stream().sorted(Comparator.comparing(o->new Integer(o.getMonth()))).collect(Collectors.toList());

注:

ここでのコンパレータのパラメータは、カプセル化されたラムダ式 new Integer(o.getMonth()) を使用します。 Integer 型に変換するのは、設計した Data エンティティ クラスの month 属性が Integer 型ではなく String 型であるためです。Integer 型への変換は、次の月のトラバース判定のためです。属性が Integer Month の場合、クラスのメソッド参照は次のようになります。コンパレータで直接定義されます。

は次のとおりです:

list.stream().sorted(Comparator.comparing(Data::getMonth).collect(Collectors.toList());

以上がJava 8 でストリームとカスタム コンパレータを使用して並べ替える方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。