目录
表设计

  1. 新增一条记录
  2. 修改排序
  3. 删除
    代码实现
  4. 简单对象
  5. 对数据按照 nextId 排序
  6. 输出结果
    表设计
    CREATE TABLE test (
    id bigint NOT NULL COMMENT ‘主键id’,
    name varchar(50) COLLATE NOT NULL COMMENT ‘名称’,
    next_id bigint DEFAULT NULL COMMENT ‘指向下一个节点的主键id’,
    ) ;
  7. 新增一条记录
    指定位置插入
    参数传递前一条数据的主键 id,根据 id 查询出该条数据的 next_id 记为 A
    设置新增数据的 next_id 为 A 并保存,
    修改前一条数据的 next_id 为新增数据的主键 id
    尾插
    默认 next_id 为 -1,表示为新增的数据,排序在最后,需要先查询出新增前最后一条数据,并将其 next_id 修改为新增数据的 id
  8. 修改排序
    参数传递

被移动数据,移动前,前一条数据的 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
移动思路如下

https://zsrimg.ikafan.com/file_images/article/202203/2022325161132327.jpg?2022225161151

  1. 删除
    参数传递前一条数据的id、和要删除数据的id,查询出删除数据的 next_id 记为 A
    修改前一条数据的 next_id 为 A
    对要删除的数据执行删除
    代码实现
  2. 简单对象
    @Data
    public class Tag {

    1. private Integer id;

    private String name;
    private Integer nextId;

    }\

  3. 对数据按照 nextId 排序
    public class Test {

    1. public static void main(String[] args) {
    2. // 添加测试数据
    3. // 这里生成的链表应为:10 -> 40 -> 20 -> 30 -> 50
    4. List<Tag> tags = addData();
    5. // 根据每项数据的nextId建立map
    6. Map<Integer, Tag> map = tags.stream().collect(Collectors.toMap(Tag::getNextId, t -> t));
    7. // -1 默认为最后一项
    8. Tag lastTag = map.get(-1);
    9. LinkedList<Tag> tagLinkedList = new LinkedList<>();
    10. tagLinkedList.addFirst(lastTag)
    11. // 使用递归从map中提取数据
    12. get(lastTag.getId(), map, tagLinkedList);
    13. tagLinkedList.forEach(System.out::println);
    14. }
    15. private static void get(int preId, Map<Integer, Tag> map, LinkedList<Tag> tagList) {
    16. Tag tag = map.get(preId);
    17. if (tag == null) {
    18. return;
    19. }
    20. tagList.addFirst(tag);
    21. get(tag.getId(), map, tagList);
    22. }
    23. private static List<Tag> addData() {
    24. List<Tag> tagList = new ArrayList<>();
    25. Tag tag1 = new Tag();
    26. tag1.setId(10);
    27. tag1.setName("tag1");
    28. tag1.setNextId(40);
    29. tagList.add(tag1);
    30. Tag tag4 = new Tag();
    31. tag4.setId(40);
    32. tag4.setName("tag4");
    33. tag4.setNextId(20);
    34. tagList.add(tag4);
    35. Tag tag2 = new Tag();
    36. tag2.setId(20);
    37. tag2.setName("tag2");
    38. tag2.setNextId(30);
    39. tagList.add(tag2);
    40. Tag tag3 = new Tag();
    41. tag3.setId(30);
    42. tag3.setName("tag3");
    43. tag3.setNextId(50);
    44. tagList.add(tag3);
    45. Tag tag5 = new Tag();
    46. tag5.setId(50);
    47. tag5.setName("tag5");
    48. tag5.setNextId(-1);
    49. tagList.add(tag5);
    50. return tagList;
    51. }

    }

  4. 输出结果
    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)

更多相关文章

  1. Android使用SAX解析XML(3)
  2. Android之零碎记忆点
  3. Android(安卓)读取Resources和Assets
  4. Android(安卓)使用HTTP(get和post)方式登陆服务器
  5. Gradle 修改生成apk时的文件名
  6. Android访问WCF(下篇)-客户端开发
  7. 去掉Android(安卓)app上的Title Bar
  8. Android使用SQLite数据库的示例
  9. Android(安卓)ListView嵌套Button,Button事件覆盖item事件解决办

随机推荐

  1. android makefile(转载)
  2. 让Android 变身回一台真正的Linux系统吧!!!
  3. 游戏开发中SurfaceView的重要作用
  4. Jetpack Compose 重磅更新!增加RecyclerVi
  5. Android 多线程-----AsyncTask详解
  6. App Widget ————android 新一代移动
  7. Android自定义视图一:扩展现有的视图,添加
  8. Android魔术——手把手教你实现水晶球波
  9. Android实现pppoe拨号上网(一)概述
  10. 给小白分享几个学习Android的网站