Java-优化比较器操作以对POJO列表进行排序
我正在为我的一个DTO编写一个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对象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())
注意:代码未经测试,希望您能理解