欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Java中按实体类属性进行自定义排序的方法

最编程 2024-08-04 15:52:19
...

下面展示一些 内联代码片

定义实体类


class user {
    private String name;
    private String userId;
    private String sex;

    user(String name, String userId, String sex) {
        this.name = name;
        this.userId = userId;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String toString() {
        return "name:" + name + "\tuserId:" + userId + "\tsex:" + sex;
    }
}

排序写法

   public static void main(String[] args) {
   //安装规则排序 ,如果不包含再list里面放到最后
       List<String> stringList = new ArrayList<>();
       stringList.add("印度");
       stringList.add("法国");
       
   	//插入数据
       List<user> list = new ArrayList<>();
       list.add(new user("中国", "ss", "1"));
       list.add(new user("美国", "ss", "1"));
       list.add(new user("日本", "ss", "1"));
       list.add(new user("法国", "ss", "1"));
       list.add(new user("印度", "ss", "1"));
       list.add(new user("俄罗斯", "ss", "1"));

       list.sort((o1, o2) -> {
           if (!stringList.contains(o1.getName())) return 1;
           if (!stringList.contains(o2.getName())) return -1;

           int a = 0;
           for (int i = 0; i < stringList.size(); i++) {
               if (stringList.get(i).equals(o1.getName())) {
                   a = i;
               }
           }
           int b = 0;
           for (int i = 0; i < stringList.size(); i++) {
               if (stringList.get(i).equals(o2.getName())) b = i;
           }
           return a - b;
       });

       list.forEach(item -> System.out.println(item.toString()));
   }

排序后

下面展示一些 内联代码片

name:印度	userId:ss	sex:1
name:法国	userId:ss	sex:1
name:中国	userId:ss	sex:1
name:美国	userId:ss	sex:1
name:日本	userId:ss	sex:1
name:俄罗斯	userId:ss	sex:1

进行简单封装


    /**
     * 自定义排序
     *
     * @param list       要排序的内容
     * @param name       排序字段名
     * @param stringList 顺序(排序规则)
     * @param <T>
     * @return
     */
    static <T> List<T> customSort(List<T> list, String name, List<String> stringList) {
        list.sort((o1, o2) -> {
            if (!stringList.contains(getFieldValue(o1, name))) return 1;
            if (!stringList.contains(getFieldValue(o2, name))) return -1;

            int a = 0;
            for (int i = 0; i < stringList.size(); i++) {
                if (stringList.get(i).equals(getFieldValue(o1, name))) {
                    a = i;
                }
            }
            int b = 0;
            for (int i = 0; i < stringList.size(); i++) {
                if (stringList.get(i).equals(getFieldValue(o2, name))) b = i;
            }
            return a - b;
        });
        return list;
    }
//获取实体类内容
    static String getFieldValue(Object target, String fieldName) {
        try {
            Object HSSFCell = FieldUtils.readField(target, fieldName, true);
            if (HSSFCell instanceof String) {
                return (String) HSSFCell;
            }
            TextRenderData textRenderData = (TextRenderData) HSSFCell;
            return textRenderData.getText();
        } catch (IllegalAccessException e) {
            throw new RuntimeException("字段类型不匹配,请检查字段类型和实体类是否一致");
        }
    }

调用

    public static void main(String[] args) {
        List<String> stringList = new ArrayList<>();
        stringList.add("印度");
        stringList.add("法国");
        stringList.add("俄罗斯");

        List<user> list = new ArrayList<>();
        list.add(new user("中国", "ss", "1"));
        list.add(new user("美国", "ss", "1"));
        list.add(new user("日本", "ss", "1"));
        list.add(new user("法国", "ss", "1"));
        list.add(new user("印度", "ss", "1"));
        list.add(new user("俄罗斯", "ss", "1"));

        list = customSort(list, "name", stringList);
        list.forEach(item -> System.out.println(item.toString()));
    }

结果

name:印度	userId:ss	sex:1
name:法国	userId:ss	sex:1
name:俄罗斯	userId:ss	sex:1
name:中国	userId:ss	sex:1
name:美国	userId:ss	sex:1
name:日本	userId:ss	sex:1

推荐阅读