需要排序的类:
public class ExperimentContent{
private Long conetentId;//内容id 非空唯一 自增
private Long preContentId; //上级节点id
private Long nextContentId;//下级节点
}
具体实现:
public List<ExperimentContent> getByExId(Long experimentId) {
//从数据库中获取需要排序的的所有对应实体类
List<ExperimentContent> ecs = experimetContentMapper.selectByExId(experimentId);
//如果是一个直接返回,如果不是再往下走
if(ecs.isEmpty() || ecs.size()==1){
return ecs;
}
//定义一个排序的结果集
List<ExperimentContent> result = new ArrayList<>();
//再从获取列表的首项
ExperimentContent begin = experimetContentMapper.selectHeadContentByExId(experimentId);
//将首项从集合中删除
ecs.remove(begin);
//将首相放入结果集中
result.add(begin);
//循环
while(begin.getNextContentId()!=null){//判断当前的元素的下一个节点是否存在 存在继续循环
for (ExperimentContent experimentContent : ecs) {
//如果是当前元素
if(experimentContent.getConetentId() == begin.getNextContentId()){
//将元素从集合中取出作为新的节点,放入结果集,
begin = experimentContent;
result.add(begin);
//并将该元素从遍历的结合中删除
ecs.remove(begin);
//结束当前循环
break ;
}
}
}
return result;
}
实际代码讲的有点模糊,举一个简单的例子,main方法共大家学习下:
public static void main(String[] args) {
//定义一个无序集合,初始化一些数据 模拟链表
List<Integer> intList = new ArrayList<Integer>();
intList.add(1);intList.add(3);intList.add(2);intList.add(5);intList.add(4);
//链表集合大小
int sum = intList.size();
//定义一个空集,用于存放排序后的结果集
List<Integer> result = new ArrayList<Integer>(sum);
//我们假定首项是 1
Integer begin = 1;
//将首项放入结果集中
result.add(begin);
//并从链表中删除
intList.remove(begin);
//位移到首项的下一项 也就是第二项
begin = begin+1;
//循环
while(begin<=sum){ //判断,总项目不能超过集合总数
//遍历链表
for (Integer temp : intList) {
//如果匹配,将元素从链表中截取出来,放入结果集中,并中断本次循环
if(temp == begin){
result.add(temp);
begin = temp+1;
intList.remove(temp);
break;
}
}
}
//遍历排序后的结果集
for (Integer temp : result) {
System.out.println(temp);
}
}
//结果如下:
1
2
3
4
5