在项目开发中,很多页面的展示,都是按照一定的顺序排列的。
要想获取一个有序的list,有两种做法:
一、使用sql查出有序的list
这种方式进行排序,是最常用的,取数据的时候,我就要求数据是按照一定的顺序排列的。这种方式适合简单的列表的读取,如果页面展示的list需要多个组合计算得到。那么顺序就不能够保证了
二、用java8的sort方法排序
这种方式,对于对象类型的list排序,需要指出按照哪个字段进行排序,排序的方式是什么样的。
排序一般都会跟筛选一块用。方便得到想要的list
下面用一个例子来演示一下:
class Rule{
public Rule(Integer code, Integer number,String remark) {
this.code = code;
this.number = number;
this.remark = remark;
}
public Integer code;
public Integer score;
public Integer max;
public Integer min;
public Integer number;
public String remark;
}
2.1一般的排序
举个例子
public static void main(String[] args) {
List<Rule> lstRule = buildRuleList();
for (int i = 0; i < lstRule.size(); i++) {
lstRule.get(i).print();
}
// 定义一个比较器,用于排序
Comparator<Rule> byNumber = Comparator.comparingInt(Rule::getNumber);
// 获取排序后的list,先通过filter筛选,然后在排序
List<Rule> rule = lstRule.stream().filter(s -> s.getCode() == 2).sorted(byNumber).collect(Collectors.toList());
System.out.println("-------------------------");
for (int i = 0; i < rule.size(); i++) {
rule.get(i).print();
}
}
private static List<Rule> buildRuleList() {
List<Rule> lstRule = new ArrayList<>();
lstRule.add(new Rule(1,10,"而且"));
lstRule.add(new Rule(2,5,"给对方"));
lstRule.add(new Rule(1,11,"多个"));
lstRule.add(new Rule(2,1,"回复"));
lstRule.add(new Rule(2,3,"回复水电费"));
return lstRule;
}
2.2复合排序
public static void main(String[] args) {
List<Rule> lstRule = buildRuleList();
for (int i = 0; i < lstRule.size(); i++) {
lstRule.get(i).print();
}
// 联合排序
Comparator<Rule> byNumber = Comparator.comparingInt(Rule::getNumber);
Comparator<Rule> byCode = Comparator.comparingInt(Rule::getCode);
Comparator<Rule> byNumberAndCode = byNumber.thenComparing(byCode);
// byNumberAndCode是一个联合排序的比较器
List<Rule> rule = lstRule.stream().filter(s -> s.getCode() == 2).sorted(byNumberAndCode).collect(Collectors.toList());
System.out.println("-------------------------");
for (int i = 0; i < rule.size(); i++) {
rule.get(i).print();
}
}
在使用这个排序方法的时候,核心的是使用stream的排序。但是在使用stream的时候有一个问题,示例如下:
Stream<Rule> stream = ruleList.stream().filter(s -> rule.getNumber().equals(s.getNumber()));
Optional<Rule> temp = stream.filter(s -> s.getNumber() == rule.getNumber()).findFirst(); //校验的数据
// 筛选之后 看还有没有数据
if (temp.isPresent()){
tempModelRule = temp.get();
}else {
//如果没有数据,在重新按照别的方式进行筛选
Stream<Rule> stream1 = stream.filter(s -> s -> rule.getNumber2().equals(s.getNumber2());
temp = stream1.sorted(byScore).findFirst(); //排序取最低分
tempModelRule = temp.get();
}
在使用stream的时候,第一次筛选的时候,如果没有获取到想要的数据。虽然 stream没有赋值。但是再次进行筛选的时候,会报错。需要重新stream一下。可能与stream的筛选的实现方式有关