一.我的使用情景
在做一个小学生四则运算系统时需要显示各个用户的做题记录,与最好成绩。在没有使用数据库,而是将这些信息先写入文档,然后在需要的时候将这些信息从文档中读取出来存到list集合中。由于没办法通过sql语句进行筛选,逆序这些操作,所以只能通过list集合实现逆序遍历与排序去重只保留同一用户最好成绩这样的操作。
二.在jsp页面逆序遍历list集合
1.使用foreach循环逆序遍历集合:
<c:set var="startIndex" value="${fn:length(studentInf)-1 }"></c:set>
<c:forEach items="${studentInf}" var="t" varStatus="status">
<ul class="ti">
<li>${studentInf[startIndex - status.index].studentId}</li>
<li>${studentInf[startIndex - status.index].perscore}%</li>
<li>${studentInf[startIndex - status.index].avgtime}</li>
<li style="width: 350px;">${studentInf[startIndex - status.index].zttime}
</li>
</ul>
</c:forEach>
2.直接使用java语言实现,只需一行代码:
Collections.reverse(list1);
三.list按某个属性排序与去重
按照某一属性对list排序(此处按成绩由高到低排序),代码如下:
Collections.sort(studentInf, new Comparator<Student>(){
public int compare(Student o1, Student o2) {
if(Double.valueOf(o1.getPerscore())<Double.valueOf(o2.getPerscore())){
return 1;
}
if(o1.getPerscore() == o2.getPerscore()){
return 0;
}
return -1;
}
});
其中studentInf是所要排序的list集合。所有用户按从高到低排序后,只要筛选出每个用户第一次出现的成绩,即为用户的最好成绩。所以此处需要对排完序的list集合进行对学号这个属性去重,只保留第一次出现时的数据的操作,具体代码如下:
for (int i = 0; i < studentInf.size(); i++) {
for (int j = i + 1; j < studentInf.size(); j++) {
if (studentInf.get(j).getStudentId().equals(studentInf.get(i).getStudentId())) {
studentInf.remove(j);
j--;
}
}
}