java使用单向链表解决数据存储自定义排序问题

网友投稿 272 2022-08-17


java使用单向链表解决数据存储自定义排序问题

目录表设计1. 新增一条记录2. 修改排序3. 删除代码实现1. 简单对象2. 对数据按照 nextId 排序3. 输出结果

表设计

CREATE TABLE `test` (

`id` bigint NOT NULL COMMENT '主键id',

`name` varchar(50) COLLATE NOT NUPoDrXICNLL COMMENT '名称',

`next_id` bigint DEFAULT NULL COMMENT '指向下一个节点的主键id',

) ;

1. 新增一条记录

指定位置插入

参数传递前一条数据的主键 id,根据 id 查询出该条数据的 next_id 记为 A设置新增数据的 next_id 为 A 并保存,修改前一条数据的 next_id 为新增数据的主键 id尾插

默认 next_id 为 -1,表示为新增的数据,排序在最后,需要先查询出新增前最后一条数据,并将其 next_id 修改为新增数据的 id

2. 修改排序

参数传递被移动数据,移动前,前一条数据的 id (C)

被移动数据,移动后,前一条数据的 id (A)

被移动数据的 id (D)查询 A 的 next_id (记为 B )查询 D 的 next_id (记为 E )修改 A 的 next_id 为 D 的主键 id修改 D 的 next_id 为 B修改 C 的 next_id 为 E

移动思路如下

3. 删除

参数传递前一条数据的id、和要删除数据的id,查询出删除数据的 next_id 记为 A修改前一条数据的 next_id 为 A对要删除的数据执行删除

代码实现

1. 简单对象

@Data

public class Tag {

private IntePoDrXICNger id;

private String name;

private Integer nextId;

}

2. 对数据按照 nextId 排序

public class Test {

public static void main(String[] args) {

// 添加测试数据

// 这里生成的链表应为:10 -> 40 -> 20 -> 30 -> 50

List tags = addData();

// 根据每项数据的nextId建立map

Map map = tags.stream().collect(Collectors.toMap(Tag::getNextId, t -> t));

// -1 默认为最后一项

Tag lastTag = map.get(-1);

LinkedList tagLinkedList = new LinkedList<>();

tagLinkedList.addFirst(lastTag)

// 使用递归从map中提取数据

get(lastTag.getId(), map, tagLinkedList);

tagLinkedList.forEach(System.out::println);

}

private static void get(int preId, Map map, LinkedList tagList) {

Tag tag = map.get(preId);

if (tag == null) {

return;

}

tagList.addFirst(tag);

get(tag.getId(), map, tagList);

}

private static List addData() {

List tagList = new ArrayList<>();

Tag tag1 = new Tag();

tag1.setId(10);

tag1.setName("tag1");

tag1.setNextId(40);

tagList.add(tag1);

Tag tag4 = new Tag();

tag4.setId(40);

tag4.setName("tag4");

tag4.setNextId(20);

tagList.add(tag4);

Tag tag2 = new Tag();

tag2.setId(20);

tag2.setName("tag2");

tag2.setNextId(30);

tagList.add(tag2);

Tag tag3 = new Tag();

tag3.setId(30);

tag3.setName("tag3");

tag3.setNextId(50);

tagList.add(tag3);

Tag tag5 = new Tag();

tag5.setId(50);

tag5.setName("tag5");

tag5.setNextId(-1);

tagList.add(tag5);

return tagList;

}

}

3. 输出结果

Tag(id=10, name=tag1, nextId=40)Tag(id=40, name=tag4, nextId=20)Tag(id=20, name=tag2, nextId=30)Tag(id=30, name=tag3, nextId=50)Tag(id=50, name=tag5, nextId=-1)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty分布式客户端接入流程初始化源码分析
下一篇:Java基础巩固小项目点菜系统的实现
相关文章

 发表评论

暂时没有评论,来抢沙发吧~