Java-优化比较器操作以对POJO列表进行排序

Java-优化比较器操作以对POJO列表进行排序,java,performance,Java,Performance,我正在为我的一个DTO编写一个比较器 每个DTO对象MyDTO都包含一组主题 class MyDTO { Long id; Set<Theme> themes; } class ThemeDTO { Long id; String title; } 类MyDTO{ 长id; 设定主题; } 班级主题{ 长id; 字符串标题; } 我们有一个给定的MEID列表作为输入,比如说Set inputHemes,我们需要对其进行比较并对MyDTO列表进行排

我正在为我的一个DTO编写一个
比较器

每个DTO对象
MyDTO
都包含一组
主题

class MyDTO {
    Long id;
    Set<Theme> themes;
}

class ThemeDTO {
    Long id;
    String title;
}
类MyDTO{
长id;
设定主题;
}
班级主题{
长id;
字符串标题;
}
我们有一个给定的MEID列表作为输入,比如说
Set inputHemes
,我们需要对其进行比较并对MyDTO列表进行排序

比较的逻辑是:

  • 如果myDto1中的匹配主题数大于myDto2中的匹配主题数,则, myDto1将排在第一位。(并将在或之前)
  • 如果匹配数相同,将排列对象 按主题标题的字母顺序排列
  • 我在下面写了comparator,但感觉它可以进一步优化

    myDTOList.sort(new Comparator<MyDTO>() {
        @Override
        public int compare(MyDTO o1, MyDTO o2) {
    
            Set<Long> o1ThemeSet = o1.getThemes().stream().map(ThemeDTO::getId).collect(toSet());
            Set<Long> o2ThemeSet = o2.getThemes().stream().map(ThemeDTO::getId).collect(toSet());
    
            // Filtering w.r.t to themes coming as input
            Set<Long> inputThemeSet = inputThemes.stream().collect(toSet());
            o1ThemeSet.retainAll(inputThemeSet);
            o2ThemeSet.retainAll(inputThemeSet);
    
            if (o1ThemeSet.size() == o2ThemeSet.size()) {
    
                // If 2 MyDTO have same number of theme matches, sorting is done alphabetically.
                return o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase());
    
            } else if (o1ThemeSet.size() < o2ThemeSet.size()) {
                return 1;
            } else {
                return -1;
            }
        }
    });
    
    myDTOList.sort(新的比较器(){
    @凌驾
    公共整数比较(MyDTO o1,MyDTO o2){
    设置o1ThemeSet=o1.getThemes().stream().map(主题为::getId).collect(主题为());
    Set o2temeset=o2.getThemes().stream().map(主题为::getId.collect(toSet());
    //将w.r.t筛选到作为输入的主题
    设置InputHemeset=InputHemes.stream().collect(toSet());
    O1主题集保留(输入主题集);
    O2temeset.Retainal(输入设置);
    如果(o1ThemeSet.size()==o2ThemeSet.size()){
    //如果2 mydt具有相同数量的主题匹配,则按字母顺序进行排序。
    返回o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase());
    }else if(o1ThemeSet.size()
    为MyDTO列表创建一个映射,其中存储MyDTO#id作为键,匹配主题作为值

    Set<Long> inputThemeSet = inputThemes.stream().collect(toSet());
    Map<Long, Integer> map = new HashMap<>();
    myDTOList.forEach(e -> {
        Integer cnt = (int)e.getThemes().stream().filter(k -> inputThemeSet.contains(k.getId())).count();
        map.put(e.getId(), cnt);
    });
    
    Set inputHemeset=inputHemes.stream().collect(toSet());
    Map Map=newhashmap();
    myDTOList.forEach(e->{
    整型cnt=(int)e.getThemes().stream().filter(k->inputhemeset.contains(k.getId()).count();
    put(e.getId(),cnt);
    });
    
    然后您可以排序,这里的优化是针对同一个MyDTO,您不需要对每两个比较MyDTO对象执行上一步操作。比较的数量远远大于列表的大小

    myDTOList.sort(new Comparator<MyDTO>() {
        @Override
        public int compare(MyDTO o1, MyDTO o2) {
            if (map.get(o1.getId()) == map.get(o2.getId())) {
                return o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase());
            } 
            return (map.get(o1.getId()) < map.get(o2.getId())) ? 1 : -1;
        }
    });
    
    myDTOList.sort(新的比较器(){
    @凌驾
    公共整数比较(MyDTO o1,MyDTO o2){
    if(map.get(o1.getId())==map.get(o2.getId()){
    返回o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase());
    } 
    return(map.get(o1.getId())
    注意:代码未经测试,希望您能理解