自定义排序含ID属性的对象:将ID为0的对象置于非0ID之后
如何将ID为0的对象排在列表末尾?
C# 实现
方法1:LINQ拆分合并
直接拆分出非0 ID的对象放在前面,再拼接ID为0的对象,还可对非0部分附加排序规则:
var sortedList = originalList.Where(x => x.ID != 0) .OrderBy(x => x.ID) // 可选:非0对象按ID升序,也可替换为OrderBy(x => x.Name) .Concat(originalList.Where(x => x.ID == 0)) .ToList();
方法2:自定义排序键
通过排序键让非0对象优先级更高,同时支持多级排序:
var sortedList = originalList.OrderBy(x => x.ID == 0 ? 1 : 0) .ThenBy(x => x.ID) // 可选:非0对象按ID排序 .ThenBy(x => x.Name) // 可选:再按Name排序 .ToList();
Java 实现
方法1:自定义Comparator
List<SomeClass> sortedList = new ArrayList<>(originalList); sortedList.sort((a, b) -> { // 优先把非0 ID对象放前面 if (a.getId() == 0 && b.getId() != 0) return 1; if (a.getId() != 0 && b.getId() == 0) return -1; // 非0对象间按ID升序,可替换为a.getName().compareTo(b.getName())按Name排序 return Integer.compare(a.getId(), b.getId()); });
方法2:Stream API
List<SomeClass> sortedList = originalList.stream() .sorted((a, b) -> { if (a.getId() == 0 && b.getId() != 0) return 1; if (a.getId() != 0 && b.getId() == 0) return -1; return Integer.compare(a.getId(), b.getId()); }) .collect(Collectors.toList());
Python 实现
利用排序键的权重区分0与非0对象,支持多级排序:
# 假设对象列表为obj_list,每个对象含id和name属性 obj_list.sort(key=lambda x: (1 if x.id == 0 else 0, x.id, x.name))
解释:排序元组第一个元素控制0/非0的顺序(非0权重为0,排在前面),后续元素可按需设置非0对象的排序规则(如ID、Name)。
内容的提问来源于stack exchange,提问作者Paul Williams
相关产品推荐
相关产品推荐

