Java拖拽排序工具类「建议收藏」

Java拖拽排序工具类「建议收藏」packagecom.ciih.jwt.util.sort;importjava.lang.reflect.Field;importjava.util.Collections;importjava.util.List;/***拖拽排序工具:此工具将传入的list重新排序后返回,使用者只需要将list重新存入数据库即可完成排序.*<>*拖拽排序必然牵扯到两个元素,被拖拽的元素和被挤压的元素.排序方式就存在两种,一种是两个元素进行交换位置,一种是一个元素拖到.

大家好,又见面了,我是你们的朋友全栈君。

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 {
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147752.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 千万别让这些举动断送了你的职业前程-好文共分享[通俗易懂]

    千万别让这些举动断送了你的职业前程-好文共分享

  • itemdatabound小结

    itemdatabound小结在DATAGRID中,如果要对某些记录进行格式化或者修饰,用到itemdatabound事件比较方便,比如,要显示某人的存款金额已经少于某个数额了,要用红色来显示等。itemdatabound事件发生在数据绑定到datagrid后,而其内容发送到客户端前。比如privatevoidOnItemDataBound(objectsender,       System.Web.UI.WebC

    2022年10月13日
  • SEH学习

    SEH学习以前觉得加技术的QQ群作用只有一个:闲聊,浪费时间现在想找5,6个长期有时间学习逆向的朋友,在一个小群里面,有问题互相讨论(只讨论技术上的问题)为了保持群的活跃,有要求如下群成员要求1懂C语言汇编,基础windows知识2懂得最基本的脱壳激活成功教程知识3乐于助人4群成员之间互相认识,了解各自水平有兴趣加我的QQ315,1028,21(逗号是为了避免

    2022年10月31日
  • 在html中加下划线

    在html中加下划线方法一:用&lt;u&gt;&lt;/u&gt;标签方法二:用text-decoration:underline;方法三:用border:1pxsolid;     padding:5px;如下范例:范例对应的结果:

  • Sublime Text 使用介绍、全套快捷键及插件推荐

    Sublime Text 使用介绍、全套快捷键及插件推荐

  • flask部署到nginx_flask部署404

    flask部署到nginx_flask部署404文章目录1.什么是uWSGI?2.uWSGI配置2.1启动一个HTTP服务器2.2并发和监控2.3启动uWSGIweb服务器2.4django中部署uWSGI2.5flask中部署uWSGI2.6web2py中部署uWSGI3.注意事项3.1虚拟环境3.2安全性和可用性4.参考文献1.什么是uWSGI?推荐这个博文uwsgi、wsgi和nginx的区别和关系一个…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号