按另一个列表对列表进行排序
Sort a list by another list
我有一个小问题让我抓狂。
我有一个
List<Integer>
带 ID。
List<ObjectA>
有 3 个变量:
一个 id 和两个字符串
我必须通过将第一个列表中包含的带有 id 的元素放在顶部,然后按字符串 asc 和第二个字符串 asc 对第二个列表进行排序。
完成这项工作最简单的方法是什么?我正在尝试使用 .sort()、比较器等
一个例子:
@Getter
@Setter
public class ObjectA {
private Integer id;
private String code;
private String name;
}
// comparator:
static class SortByCode implements Comparator<ObjectA> {
public int compare(ObjectA a, ObjectA b) {
String as = a.getCode();
String bs = b.getCode();
return as.compareTo(bs);
}
}
static class SortByName implements Comparator<ObjectA> {
public int compare(ObjectA a, ObjectA b) {
String as = a.getName();
String bs = b.getName();
return as.compareTo(bs);
}
}
// then in service:
List<Integer> idsPreferred = new ArrayList<>();
List<ObjectA> listObj = new ArrayList<>();
idsPreferred = .... add preferred ids;
listObj = .... add objects;
listObj.sort(new SortByCode()).thenComparing(new SortByName());
有了这个,我按代码和名称排序 - 但我需要添加按第一个列表排序 - 我需要列表中包含 id 的元素排在其他元素之前。
解决方案将涉及 2 个步骤-
- 检查第二个列表中存在于第一个列表中的对象的 ID。
- 使用建议的任一解决方案对包含的对象进行排序 - How to sort List of objects by some property
我想像这样使用提取键的链式比较:
listObj.sort(Comparator.comparing(o -> !idsPreferred.contains(((ObjectA) o).getId()))
.thenComparing(o -> ((ObjectA) o).getId())
.thenComparing(o -> ((ObjectA) o).getCode())
.thenComparing(o -> ((ObjectA) o).getName()));
或
listObj.sort(Comparator.comparing(ObjectA::getId,
(id1,id2)-> {if (!((idsPreferred.contains(id1))^idsPreferred.contains(id2)))
return 0;
else return (idsPreferred.contains(id2))?1:-1;})
.thenComparing(ObjectA::getId)
.thenComparing(ObjectA::getCode)
.thenComparing(ObjectA::getName));
我有一个小问题让我抓狂。
我有一个
List<Integer>
带 ID。List<ObjectA>
有 3 个变量: 一个 id 和两个字符串
我必须通过将第一个列表中包含的带有 id 的元素放在顶部,然后按字符串 asc 和第二个字符串 asc 对第二个列表进行排序。
完成这项工作最简单的方法是什么?我正在尝试使用 .sort()、比较器等
一个例子:
@Getter
@Setter
public class ObjectA {
private Integer id;
private String code;
private String name;
}
// comparator:
static class SortByCode implements Comparator<ObjectA> {
public int compare(ObjectA a, ObjectA b) {
String as = a.getCode();
String bs = b.getCode();
return as.compareTo(bs);
}
}
static class SortByName implements Comparator<ObjectA> {
public int compare(ObjectA a, ObjectA b) {
String as = a.getName();
String bs = b.getName();
return as.compareTo(bs);
}
}
// then in service:
List<Integer> idsPreferred = new ArrayList<>();
List<ObjectA> listObj = new ArrayList<>();
idsPreferred = .... add preferred ids;
listObj = .... add objects;
listObj.sort(new SortByCode()).thenComparing(new SortByName());
有了这个,我按代码和名称排序 - 但我需要添加按第一个列表排序 - 我需要列表中包含 id 的元素排在其他元素之前。
解决方案将涉及 2 个步骤-
- 检查第二个列表中存在于第一个列表中的对象的 ID。
- 使用建议的任一解决方案对包含的对象进行排序 - How to sort List of objects by some property
我想像这样使用提取键的链式比较:
listObj.sort(Comparator.comparing(o -> !idsPreferred.contains(((ObjectA) o).getId()))
.thenComparing(o -> ((ObjectA) o).getId())
.thenComparing(o -> ((ObjectA) o).getCode())
.thenComparing(o -> ((ObjectA) o).getName()));
或
listObj.sort(Comparator.comparing(ObjectA::getId,
(id1,id2)-> {if (!((idsPreferred.contains(id1))^idsPreferred.contains(id2)))
return 0;
else return (idsPreferred.contains(id2))?1:-1;})
.thenComparing(ObjectA::getId)
.thenComparing(ObjectA::getCode)
.thenComparing(ObjectA::getName));