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

移动思路如下

java使用单向链表解决数据存储自定义排序问题_第1张图片

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 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)

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

你可能感兴趣的:(java使用单向链表解决数据存储自定义排序问题)