设计思路
置顶:将该数据放到全局数据收尾,其余数据顺序不变【将需要置顶数据的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