>  기사  >  Java  >  Java 8에서 스트림 및 사용자 정의 비교기를 사용하여 정렬하는 방법은 무엇입니까?

Java 8에서 스트림 및 사용자 정의 비교기를 사용하여 정렬하는 방법은 무엇입니까?

王林
王林앞으로
2023-05-07 21:46:061609검색

java8 스트림 정렬 및 사용자 정의 비교기

Java 8 스트림 정렬 LIst 및 사용자 정의 객체 비교기 사용

주된 비교는 시간이지만 시간은 가장 늦은 시간입니다. Java의 Compareto 메소드는 ACSII 코드를 비교하므로 2020년과 2021년이 됩니다. 확실히 0이 앞에 있지만 우리에게 필요한 것은 가장 늦은 날짜이므로 반환된 결과를 반전시킵니다. 일반적으로 객체 1의 시간이 객체 2의 편집 시간보다 작을 경우 객체 1의 편집 시간과 객체 2의 시간을 비교합니다. 객체 2. 시간은 1을 반환하므로 2020년이 앞에 있다는 것을 알 수 있습니다. 비교 결과는 3개만 있으므로 반전만 하면 됩니다. 하나는 오름차순으로 1이고, 내림차순으로 -1이고, 0은 같음을 의미합니다. (문자열 클래스는 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() 메서드를 사용하여 사용자 정의 정렬을 수행할 수 있습니다.

사용법에 대해 이야기해 보겠습니다.

여기의 예제 데이터는 목록 컬렉션인 Listb698f00c7a5e368bd282ff25ef940af4목록이며 데이터 엔터티 클래스에는 많은 속성이 있습니다. , 시간 필드, 월을 포함하여 stream().sorted() 메서드를 사용하여 정렬할 때 요소가 클래스 참조 유형이므로 오름차순으로 월별로 정렬하도록 비교기를 사용자 정의해야 합니다.

코드는 다음과 같습니다:

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

참고:

여기서 비교기의 매개변수는 Lambda 표현식인 new Integer(o.getMonth())를 사용합니다. 이러한 종류의 Integer 유형 캡슐화는 우리가 사용하는 데이터 엔터티 클래스 때문입니다. 월 속성은 정수가 아닌 문자열 유형입니다. 이후 월 순회 판단을 위해 정수로 변환됩니다. 속성이 정수 월인 경우 클래스의 메소드 참조를 다음과 같이 직접 정의할 수 있습니다.

위 내용은 Java 8에서 스트림 및 사용자 정의 비교기를 사용하여 정렬하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제