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

 更新时间:2022年03月25日 16:12:54   作者:_灯火阑珊处  
本文主要介绍了java使用单向链表解决数据存储自定义排序问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

表设计

CREATE TABLE `test` (
  `id` bigint NOT NULL COMMENT '主键id',
  `name` varchar(50) COLLATE NOT NULL COMMENT '名称',
  `next_id` bigint DEFAULT NULL COMMENT '指向下一个节点的主键id',
) ;

1. 新增一条记录

  • 指定位置插入

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

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

2. 修改排序

  • 参数传递

    被移动数据,移动前,前一条数据的 idC

    被移动数据,移动后,前一条数据的 idA

    被移动数据的 idD

  • 查询 Anext_id (记为 B
  • 查询 Dnext_id (记为 E
  • 修改 Anext_idD 的主键 id
  • 修改 Dnext_idB
  • 修改 Cnext_idE

移动思路如下

3. 删除

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

代码实现

1. 简单对象

@Data
public class Tag {

    private Integer id;

    private String name;

    private Integer nextId;

}

2. 对数据按照 nextId 排序

public class Test {

    public static void main(String[] args) {
        // 添加测试数据
        // 这里生成的链表应为:10 -> 40 -> 20 -> 30 -> 50
        List<Tag> tags = addData();
        // 根据每项数据的nextId建立map
        Map<Integer, Tag> map = tags.stream().collect(Collectors.toMap(Tag::getNextId, t -> t));
        // -1 默认为最后一项
        Tag lastTag = map.get(-1);

        LinkedList<Tag> tagLinkedList = new LinkedList<>();
        tagLinkedList.addFirst(lastTag)

        // 使用递归从map中提取数据
        get(lastTag.getId(), map, tagLinkedList);

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

    }

    private static void get(int preId, Map<Integer, Tag> map, LinkedList<Tag> tagList) {
        Tag tag = map.get(preId);
        if (tag == null) {
            return;
        }
        tagList.addFirst(tag);
        get(tag.getId(), map, tagList);
    }

    private static List<Tag> addData() {
        List<Tag> 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)

到此这篇关于java使用单向链表解决数据存储自定义排序问题的文章就介绍到这了,更多相关java 数据存储自定义排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot 通过FastJson实现bean对象和Json字符串互转问题

    Springboot 通过FastJson实现bean对象和Json字符串互转问题

    这篇文章主要介绍了Springboot 通过FastJson实现bean对象和Json字符串互转,本文尝试验证两种场景给大家详细介绍,对Springboot FastJson实现bean和Json互转问题,感兴趣的朋友一起看看吧
    2022-08-08
  • Java实现学生管理系统详解

    Java实现学生管理系统详解

    这篇文章主要为大家详细介绍了Java实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-10-10
  • 浅析Java中的内存泄漏

    浅析Java中的内存泄漏

    这篇文章主要介绍了Java中的内存泄漏,包括其基本概念和基本的预防措施,需要的朋友可以参考下
    2015-07-07
  • Java局部内部类原理与用法实例分析

    Java局部内部类原理与用法实例分析

    这篇文章主要介绍了Java局部内部类原理与用法,结合实例形式分析了Java局部内部类功能、用法及相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • 纯java代码实现抽奖系统

    纯java代码实现抽奖系统

    这篇文章主要为大家详细介绍了纯java代码实现抽奖系统,无连接数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • springboot集成mybatis plus和dynamic-datasource注意事项说明

    springboot集成mybatis plus和dynamic-datasource注意事项说明

    这篇文章主要介绍了springboot集成mybatis plus和dynamic-datasource注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • spring boot实现软删除的示例代码

    spring boot实现软删除的示例代码

    这篇文章主要介绍了spring boot实现软删除的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 如何使用Spring AOP的通知类型及创建通知

    如何使用Spring AOP的通知类型及创建通知

    这篇文章主要给大家介绍了关于如何使用Spring AOP的通知类型及创建通知的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring AOP具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • SpringBoot+WebMagic+MyBaties实现爬虫和数据入库的示例

    SpringBoot+WebMagic+MyBaties实现爬虫和数据入库的示例

    WebMagic是一个开源爬虫框架,本项目通过在SpringBoot项目中使用WebMagic去抓取数据,最后使用MyBatis将数据入库。具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 猜你不知道Spring Boot的几种部署方式(小结)

    猜你不知道Spring Boot的几种部署方式(小结)

    这篇文章主要介绍了猜你不知道Spring Boot的几种部署方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论