首頁 > 軟體

java使用單向連結串列解決資料儲存自定義排序問題

2022-03-25 19:01:04

表設計

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 資料儲存自定義排序內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com