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 数据存储自定义排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ集群消费与广播消费模式

    RocketMQ集群消费与广播消费模式

    这篇文章主要介绍了RocketMQ集群消费与广播消费模式,消息队列RocketMQ版支持集群消费和广播消费,本文介绍集群消费和广播消费的基本概念、适用场景、功能差异、注意事项以及设置方式
    2023-02-02
  • java使用common-httpclient包实现post请求方法示例

    java使用common-httpclient包实现post请求方法示例

    这篇文章主要给大家介绍了关于java使用common-httpclient包实现post请求的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • 浅析Java中的访问控制权限

    浅析Java中的访问控制权限

    这篇文章主要介绍了浅析Java中的访问控制权限,在Java中,提供了四种访问权限控制,分别是默认访问权限、public、private以及protected,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 基于Java回顾之多线程详解

    基于Java回顾之多线程详解

    在这篇文章里,我们关注多线程。多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性、如何创建线程、线程的状态切换以及线程通信,我们把线程同步的话题留到下一篇文章中
    2013-05-05
  • java中的tostring方法的具体用法

    java中的tostring方法的具体用法

    这篇文章主要介绍了java中的tostring方法的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们来一起学习一下吧
    2019-06-06
  • Spring配置多数据源切换

    Spring配置多数据源切换

    今天小编就为大家分享一篇关于Spring配置多数据源切换,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • h2database在springboot中的使用教程

    h2database在springboot中的使用教程

    这篇文章主要介绍了h2database在springboot中的使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java设计模式之23种设计模式详解

    Java设计模式之23种设计模式详解

    这篇文章主要介绍了Java设计模式之23种设计模式详解,设计模式使代码编制真正工程化,设计模式是软件工程的基石,项目中合理的运用设计模式可以完美的解决很多问题,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java 字节数组类型(byte[])与int类型互转方法

    Java 字节数组类型(byte[])与int类型互转方法

    下面小编就为大家带来一篇Java 字节数组类型(byte[])与int类型互转方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Spring Boot application.yml配置文件示例详解

    Spring Boot application.yml配置文件示例详解

    本文详细介绍了SpringBootapplication.yml配置文件的使用和配置项,通过学习本文,您应该已经掌握了如何使用application.yml文件来配置SpringBoot应用程序的不同组件,如数据源、数据库、缓存、邮件服务等,感兴趣的朋友一起看看吧
    2025-02-02

最新评论