首页 > 编程语言 >java实现标签排序置顶

java实现标签排序置顶

时间:2024-03-18 16:44:07浏览次数:11  
标签:sort Tag java tags 标签 tag currentIndex 置顶

设计思路

置顶:将该数据放到全局数据收尾,其余数据顺序不变【将需要置顶数据的sort设置为全局Min(sort)-1】

置尾:将数据放到全局末尾,其余不变【将需要置尾的数据sort设置为全局Max(sort)+1】

交换:两位位置交换,其余不变【将需要交换数据的sort互换即可】

拖动:局部顺序变化【将4插到1后面,降顺序变动的数据4、2、3的sort取出然后对sort进行从小到大排序,依次赋值4、3、2】

DB设计

tag表,主键为tag_id,排序字段为sort,其中sort设计为有符号类型会存在负值,但能很好保证最小变动原则,高效完成排序操作。新增或指定操作理论上sort不会重复,但可能因为删除而不连续,拖动可以将数据排序后一次提交

实现

import java.util.ArrayList;  
import java.util.Collections;  
import java.util.Comparator;  
import java.util.List;  
  
public class TagService {  
  
    // 假设tags是一个包含所有标签的列表,这个列表从数据库或其他数据源获取  
    private List<Tag> tags = new ArrayList<>();  
  
    // 添加标签到列表的方法  
    public void addTag(Tag tag) {  
        tags.add(tag);  
    }  
  
    // 获取所有标签的方法  
    public List<Tag> getAllTags() {  
        return tags;  
    }  
  
    // 更新标签排序的方法  
    public void updateTagSort(Tag tag, String action) {  
        int currentIndex = tags.indexOf(tag);  
        int newSort;  
  
        if (action.equals("up")) {  
            if (currentIndex > 0) {  
                // 与前一个标签交换位置  
                Tag previousTag = tags.get(currentIndex - 1);  
                newSort = previousTag.getSort();  
                previousTag.setSort(tag.getSort());  
                tag.setSort(newSort);  
                Collections.swap(tags, currentIndex, currentIndex - 1);  
            }  
        } else if (action.equals("down")) {  
            if (currentIndex < tags.size() - 1) {  
                // 与后一个标签交换位置  
                Tag nextTag = tags.get(currentIndex + 1);  
                newSort = nextTag.getSort();  
                nextTag.setSort(tag.getSort());  
                tag.setSort(newSort);  
                Collections.swap(tags, currentIndex, currentIndex + 1);  
            }  
        } else if (action.equals("top")) {  
            // 置顶操作,将当前标签移到列表的第一个位置  
            newSort = 1;  
            tag.setSort(newSort);  
            Collections.rotate(tags.subList(0, currentIndex + 1), -currentIndex);  
            // 更新后续标签的sort值,以保持连续性  
            for (int i = currentIndex; i < tags.size(); i++) {  
                tags.get(i).setSort(i + 1);  
            }  
        }  
          
        // 更新数据库或其他数据源  
        // ...  
    }  
  
    // 根据sort字段对标签列表进行排序的方法  
    public void sortTags() {  
        tags.sort(Comparator.comparingInt(Tag::getSort));  
    }  
  
    // 主方法或测试方法  
    public static void main(String[] args) {  
        TagService tagService = new TagService();  
        // 假设已经添加了一些标签到tags列表  
        // ...  
          
        // 获取一个特定的标签对象  
        Tag tagToUpdate = tagService.tags.get(3); // 举例获取第四个标签  
  
        // 调用更新排序的方法  
        tagService.updateTagSort(tagToUpdate, "up"); // 或者 "down" 或 "top"  
  
        // 重新排序标签列表  
        tagService.sortTags();  
  
        // 打印更新后的标签列表  
        for (Tag tag : tagService.getAllTags()) {  
            System.out.println("Tag ID: " + tag.getTagId() + ", Sort: " + tag.getSort());  
        }  
    }  
}

 

标签:sort,Tag,java,tags,标签,tag,currentIndex,置顶
From: https://www.cnblogs.com/cgy-home/p/18080862

相关文章

  • 【Java入门教程】第五讲:if-else控制语句
    现实世界是复杂多变的,同一个程序我们需要根据不同的场景做出不同的反应。在Java编程中,if-else 语句就是这样一种工具,它允许程序根据不同的条件执行不同的代码块。一、基础语法if-else 语句的基本语法结构如下:if(condition){//代码块1:当条件为true时执行}else......
  • Java初学第三天
    1、封装和多态封装封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作系统的源代码进行有机结合,形成类,其中数据和函数都是类的成员封装、继承、多态是面向对象的主要......
  • Java编程思想读书笔记
    1.finalize()方法垃圾回收器只能回收通过new创建的对象的内存空间,但由于Java可以调用本地方法,本地方法中有可能通过c语言的malloc()方法来分配内存,所以垃圾回收器会执行一次finalize()方法来调用C语言的free()方法(finalize()方法需要自己去编写代码去调用本地方法)来释放内存2.封......
  • Java导出多个Excel放在压缩包里
    之前做过一个导出多个Excel放在压缩包里的需求,当时也是网上找的思路,现在已经找不到之前的文章了,不多废话直接上代码。publicvoidexport(HttpServletRequestrequest,HttpServletResponseresponse){StringzipFileName="zipname.zip";List<Workbook>workbooks......
  • java springboot 指定运行端口
    javaspringboot指定运行端口 方法1:修改源代码里的“\src\main\resources\application.properties”文件,增加或修改server.port=8081 方法2:如果是已经打包好的jar包,在运行时指定端口。可以将 “\src\main\resources\application.properties” 文件复制到jar包同......
  • Linux Java调用 海康sdk报 Unable to load library '/home/slife/bsmt/HCNetSDK_linux
    1、问题在Linux下java调研libPlayCtrl.so文件失败 解决方案:sudovim~/.bashrc 在该文件末尾追加:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/slife/bsmt/HCNetSDK_linux64/刷新一下source~/.bashrcok参考链接 https://www.cnblogs.com/kikyoqiang/p/14911373.......
  • BigDecimal值在java比较的两种方法
    1、使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等。BigDecimald1=newBigDecimal("123.45");BigDecimald2=newBigDecimal("123.45000");System.out.println(d1.equals(d2));//false,因为scale不同System.out.println(d1.equa......
  • 【编程向导】JavaScript-基础语法-解构赋值
    梦里繁花落尽,此情未央,此意难忘,弦虽断,曲犹扬。!与技术共同呼吸,与程序员共命运。世树科技承“技驱动,理致胜”理念、国风编程。解构赋值解构赋值(Destructing)语法是一个JavaScript表达式,这使得可以将值从数组或属性从对象提取到不同的变量中。数组的解构赋值varfoo......
  • 【Java】i18n国际化解决方案:通过AOP切面实现多语言的配置
    需求背景国际化多语言配置。相较于常规的方法,这次采取了切面的方式,来完成所有字段->不同语言的映射。大致逻辑:按常规的国际化,写一个获取语言的方法:getMsg(Stringcode);写一个深层遍历对象的方法traverseObject(Objectobj),通过反射,获取所有类型为字符串的字段,并实现对字......
  • Java面试问题集合,Java面试题合集
    前言:说到算法,相信每一个程序员和接触过程序员的朋友都不会陌生,直到现在算法一直占着面试必问的地位,而算法面试也仍是当前最适合公司筛选程序员的方法之一,在阿里,字节跳动、华为等公司带动下,无论是求职者还是面试官,都逐渐认识到算法面试其实是相对高效、准确且公平的筛选机制......