package com.ciih.jwt.util.sort;import java.lang.reflect.Field;
import java.util.Collections;
import java.util.List;/*** 拖拽排序工具:此工具将传入的list重新排序后返回,使用者只需要将list重新存入数据库即可完成排序.* <>* 拖拽排序必然牵扯到两个元素,被拖拽的元素和被挤压的元素.排序方式就存在两种,一种是两个元素进行交换位置,一种是一个元素拖到另一元素的下发或上方.* 1.此方法需要传入两个基准元素之间的所有元素的集合,* 2.以及两个基准元素的id,* 3.排序方式.* </>** @author sunziwen* @since 2021-3-23 19:15:07*/
public class SortUtil {/*** 此方法需要在T类的主键上打@IdProperty注解,在排序字段上打@OrderProperty注解.** @param list 需要重新排序的元素集合* @param id1  拖拽元素* @param id2  定位元素* @param type 排序类型(1交换,2挤压排序)* @param <T>  泛型* @return List<T>*/public static <T> List<T> sort(List<T> list, Object id1, Object id2, SortType type) {String idProperty = null;String orderProperty = null;Field[] declaredFields = list.get(0).getClass().getDeclaredFields();for (Field declaredField : declaredFields) {IdProperty idAnnotation = declaredField.getAnnotation(IdProperty.class);OrderProperty orderAnnotation = declaredField.getAnnotation(OrderProperty.class);if (idAnnotation != null) {idProperty = declaredField.getName();}if (orderAnnotation != null) {orderProperty = declaredField.getName();}}if (idProperty == null) {throw new RuntimeException("没有在主键属性上打@IdProperty注解");}if (orderProperty == null) {throw new RuntimeException("没有在排序属性上打@OrderProperty注解");}return sort(list, id1, id2, type, idProperty, orderProperty);}/*** @param list          需要重新排序的元素集合* @param id1           拖拽元素* @param id2           定位元素* @param type          排序类型(1交换,2挤压排序)* @param idProperty    主键属性名,一般是"id"* @param orderProperty 排序属性名* @param <T>           泛型* @return List<T>*/public static <T> List<T> sort(List<T> list, Object id1, Object id2, SortType type, String idProperty, String orderProperty) {//排序list.sort((x, y) -> {try {Field fieldx = x.getClass().getDeclaredField(orderProperty);Field fieldy = y.getClass().getDeclaredField(orderProperty);fieldx.setAccessible(true);fieldy.setAccessible(true);int i = Integer.parseInt(fieldx.get(x).toString());int j = Integer.parseInt(fieldy.get(y).toString());return i - j;} catch (IllegalAccessException | NoSuchFieldException e) {e.printStackTrace();throw new RuntimeException("反射异常了");}});if (list == null || list.size() <= 0) {return list;}//傻子在原地拖动if (id1.equals(id2)) {return list;}try {T tFirst = list.get(0);T tLast = list.get(list.size() - 1);Field orderFirst = tFirst.getClass().getDeclaredField(orderProperty);orderFirst.setAccessible(true);Object orderValueFirst = orderFirst.get(tFirst);Field orderLast = tLast.getClass().getDeclaredField(orderProperty);orderLast.setAccessible(true);Object orderValueLast = orderLast.get(tLast);//交换位置if (type == SortType.EXCHANGE) {orderFirst.set(tFirst, orderValueLast);orderLast.set(tLast, orderValueFirst);}//冒泡排序需要知道是从上往下,还是从下往上拖拽.因此需要知道他们的order值 order1<order2则是从上往下,反之亦然.if (type == SortType.BUBBLE) {//order集合int[] orders = list.stream().mapToInt(x -> {try {Field order = x.getClass().getDeclaredField(orderProperty);order.setAccessible(true);Object orderVal = order.get(x);if (orderVal == null) {throw new RuntimeException("有元素缺失排序属性值");}return Integer.parseInt(orderVal.toString());} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();throw new RuntimeException("未知异常:联系作者");}}).toArray();//获取id1和id2的排序值,用来确认是拖拽方向Integer order1 = null;Integer order2 = null;for (T t : list) {Field idField = t.getClass().getDeclaredField(idProperty);idField.setAccessible(true);Object idVal = idField.get(t);if (idVal.equals(id1)) {Field orderField = t.getClass().getDeclaredField(orderProperty);orderField.setAccessible(true);order1 = Integer.parseInt(orderField.get(t).toString());}if (idVal.equals(id2)) {Field orderField = t.getClass().getDeclaredField(orderProperty);orderField.setAccessible(true);order2 = Integer.parseInt(orderField.get(t).toString());}}if (order1 == null || order2 == null) {throw new RuntimeException("排序字段缺失属性值");}//从上往下拖拽if (order1 < order2) {//将首位元素挪到末尾list.remove(tFirst);list.add(tFirst);//从下往上拖拽} else {//将末尾元素追加到首位T last = list.get(list.size() - 1);list.remove(last);Collections.reverse(list);list.add(last);Collections.reverse(list);}//将元素集合与order集合重新绑定for (int i = 0; i < orders.length; i++) {T t = list.get(i);Field order = t.getClass().getDeclaredField(orderProperty);order.setAccessible(true);order.set(t, orders[i]);}}} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();throw new RuntimeException("未知异常:联系作者");}return list;}}//@Data
//@AllArgsConstructor
//class User {
//    @IdProperty
//    private Integer id;
//    private String username;
//    private String password;
//    @OrderProperty
//    private Integer order;
//
//    public static void main(String[] args) {
//        ArrayList<User> users = new ArrayList<>();
//        users.add(new User(1, "乔峰", "降龙十八掌", 1));
//        users.add(new User(2, "段誉", "六脉神剑", 2));
//        users.add(new User(3, "虚竹", "北冥神功", 3));
//        users.add(new User(4, "鸠摩智", "小无相功", 4));
//        users.add(new User(5, "慕容复", "斗转星移", 5));
//        users.add(new User(6, "丁春秋", "化功大法", 6));
//        List<User> sort = SortUtil.sort(users, 1, 6, SortType.BUBBLE);
//        sort.sort(Comparator.comparingInt(User::getOrder));
//        sort.forEach(System.out::println);
//    }
//}
package com.ciih.jwt.util.sort;public enum SortType {/*** <p>排序方式<p/>* <>1交换式</>* <>2冒泡式</>*/EXCHANGE(1), BUBBLE(2);private Integer status;SortType(Integer status) {this.status = status;}public Integer getStatus() {return status;}
}
package com.ciih.jwt.util.sort;import java.lang.annotation.*;/*** @author sunziwen*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface IdProperty {
}
package com.ciih.jwt.util.sort;import java.lang.annotation.*;/*** @author sunziwen*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface OrderProperty {
}

Java拖拽排序工具类相关推荐

  1. Sortable简单好用的拖拽排序工具

    Sortable超简单好用的拖拽排序工具 很好的拖拽排序工具,支持原始js,vue ,react,angular,可惜官网访问太慢,将文档整理放博客里,随时访问,https://www.npmjs.c ...

  2. JAVA 排序工具类

    提供了以下排序: 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 桶排序 堆排序 package com.xingej.algorithm.sort;import java.util.Ar ...

  3. java堆排序工具包_JAVA 排序工具类

    提供了以下排序:冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 桶排序 堆排序 package com.xingej.algorithm.sort;import java.util.Arr ...

  4. java 工具类sort_Java 通用排序工具类ListSortUtils

    场景:Java 类 需 重新排序,有时升序.有时倒叙,有时是多字段排序 代码: package GenericTest; import java.lang.reflect.InvocationTarg ...

  5. Java通用工具类之按对象属性排序工具类

    本工具类为按对象属性排序工具类,实现的功能: 1.按对象的一个属性和多个属性进行排序. 2.按对象属性正序和倒序排列. 3.完美支持int等基础类和Integer等包装类. 4.完美支持属性为实现了C ...

  6. java实现拖动框排序_拖拽排序后端设计与实现

    背景 最近在做课程后台开发时,遇到一个很有意思的问题.问题是这样的,有多节课程,运营人员可以根据需要调整课程的先后顺序,从而更改课程的展示顺序. 接到这个需求,立刻就想到了以前做首页banner轮播图 ...

  7. Android表格拖拽排序,Android 拖拽排序控件 DragGridView

    Android 拖拽排序控件 DragGridView Android 开发中,我们经常会遇到条目拖拽排序的需求,特别是在新闻类应用中就更普遍了.其实,我们在网上可以搜到许多关于拖拽排序的自定义控件, ...

  8. 前端项目中常用的工具包(拖拽排序表格、打印导出表格、文本复制等)【持续更新~~~】

    表格类: cdn库 cdn vxe-table[开源的多功能表格] 简介 一个基于 vue 的 PC 端表格组件,支持增删改查.虚拟滚动.懒加载.快捷菜单.数据校验.树形结构.打印导出.表单渲染.数据 ...

  9. 可拖拽排序的GridView(高仿今日头条编辑频道效果)

    最近在一直在用今日头条,发现在我的频道编辑时的拖拽排序体验非常有意思,这种拖拽功能其实在支付宝等app上也频繁使用,于是打算自己研究一下,网上虽然有很多类似于此类功能的博客,但实现的都不是特别完美,效 ...

最新文章

  1. Mindmanager 甘特图杠上Mindmanager 鱼骨图
  2. SQLServer中使用Split功能分割字符串
  3. Java 类的热替换---转载
  4. 奇怪的.strip(alir) #()里面有东西 待问老师........
  5. 富士施乐打印机-查看端口号
  6. mysql报11004_使用mysqli扩展技术查看服务器连接错误报告的方法
  7. tf.one_hot()
  8. GPS经纬度转百度地图经纬度
  9. 多媒体视频会议系统的测试方法
  10. 10x 程序员工作法 - 总复习 | 重新审视“最佳实践”
  11. linux之hugepage
  12. 推荐几个做自媒体好用的电影素材网站
  13. TCP粘包的分析和处理
  14. PCIe 分类、速度
  15. 图像分类数据集 (FASHION-MNIST)
  16. uni-app 介绍,什么是uni-app,它是干嘛的
  17. 字节跳动启动大规模校招
  18. 嵌入式新闻早班车-第5期
  19. 云脑启智 开源赋能|2021新一代人工智能院士高峰论坛暨启智开发者大会即将开幕
  20. Python函数返回值的作用

热门文章

  1. MCC和MNC的解释
  2. 火星人抵京,带回新版《马克思数学手稿》
  3. 冷酸灵母公司通过注册:年营收13亿 温氏投资与重庆百货是股东
  4. Windows10系统自定义右键新建菜单(添加md和docx文件)
  5. 2020年压力管道巡检维护操作证考试及压力管道巡检维护模拟考试软件
  6. NYOJ 喷水装置(一)
  7. linux内核 quota,Linux磁盘配额(Quota)--鸟哥私房菜笔记
  8. Cache的基本原理
  9. 工作小记系列2:Kubevirt简介
  10. 如何实现云上的 RADIUS 认证服务?