不懂就问:list排序求助

君小宜 2020-10-20 06:40:25
如题 有一个List<People> 集合 people对象有如下五个属性 姓名 年龄 职业 电话 地址 有这样一个集合 姓名1 年龄1 职业1 电话1 地址1 姓名2 年龄2 电话2 地址2 姓名3 年龄3 职业3 姓名4 职业4 电话4 地址4 姓名5 年龄5 姓名6 年龄6 职业6 地址6 需求是按照对象的字段有值个数进行排序 字段有值多的在前面 少的在后面 字段有值个数一样的随机排 排序后是这样的 姓名1 年龄1 职业1 电话1 地址1 姓名2 年龄2 电话2 地址2 姓名6 年龄6 职业6 地址6 姓名4 职业4 电话4 地址4 姓名3 年龄3 职业3 姓名5 年龄5 请问这个有什么方法实现或者思路?多谢
...全文
310 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
实体类里写个方法计算属性非空个数就行了 @Data public class People { private String name; private Integer age; private Integer height; public People(String name, Integer age,Integer height) { this.name = name; this.age = age; this.height=height; } private int getCharacter() { return (int) Arrays.stream(this.getClass().getDeclaredFields()) .filter(a -> { try { return a.get(this) != null; } catch (IllegalAccessException e) { } return false; } ).count(); } public static void main(String[] args) { People p1 = new People("小花",null,null); People p2 = new People("李四", 22,175); People p3 = new People("张三", 21,null); List<People> list = Lists.newArrayList(p1,p2,p3); list.sort(Comparator.comparing(People::getCharacter)); list.forEach(System.out::println); } }
码农小王同学 2020-10-20
  • 打赏
  • 举报
回复
二楼正解,重写compareTo方法比较方便
KeepSayingNo 2020-10-20
  • 打赏
  • 举报
回复
给people加一个属性count,统计出有值字段放在这里,然后针对这个字段排序
梦天城 2020-10-20
  • 打赏
  • 举报
回复
引用 2 楼 雨筱沫 的回复:
T.R(age=1, career=null, phone=null, address=1) T.R(age=2, career=null, phone=null, address=2) T.R(age=3, career=3, phone=null, address=3) T.R(age=null, career=null, phone=null, address=4) =================== T.R(age=3, career=3, phone=null, address=3) T.R(age=1, career=null, phone=null, address=1) T.R(age=2, career=null, phone=null, address=2) T.R(age=null, career=null, phone=null, address=4)

 for (int i = 0; i < list.size() - 1; i++) {
            for (int j = 0; j < list.size() - i - 1; j++) {
                if(checkObjFieldIsNull(list.get(j)) > checkObjFieldIsNull(list.get(j + 1))) {
                    R r = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, r);
                }
            }
        }
public static int checkObjFieldIsNull(Object obj) throws IllegalAccessException {
        int num = 0;
        for (Field f : obj.getClass().getDeclaredFields()) {
            f.setAccessible(true);
            if(f.get(obj) == null) {
                num++;
            }
        }
        return num;
    }
import java.lang.reflect.Field;
梦天城 2020-10-20
  • 打赏
  • 举报
回复
T.R(age=1, career=null, phone=null, address=1) T.R(age=2, career=null, phone=null, address=2) T.R(age=3, career=3, phone=null, address=3) T.R(age=null, career=null, phone=null, address=4) =================== T.R(age=3, career=3, phone=null, address=3) T.R(age=1, career=null, phone=null, address=1) T.R(age=2, career=null, phone=null, address=2) T.R(age=null, career=null, phone=null, address=4)

 for (int i = 0; i < list.size() - 1; i++) {
            for (int j = 0; j < list.size() - i - 1; j++) {
                if(checkObjFieldIsNull(list.get(j)) > checkObjFieldIsNull(list.get(j + 1))) {
                    R r = list.get(j);
                    list.set(j, list.get(j + 1));
                    list.set(j + 1, r);
                }
            }
        }
public static int checkObjFieldIsNull(Object obj) throws IllegalAccessException {
        int num = 0;
        for (Field f : obj.getClass().getDeclaredFields()) {
            f.setAccessible(true);
            if(f.get(obj) == null) {
                num++;
            }
        }
        return num;
    }
  • 打赏
  • 举报
回复
重写compareTo方法,如果可以在People对象上加上一个表示几个属性值有值的变量,就根据这个判断,如果不可以,就在方法内依次判断两个对象的各个属性,如果大的放前面,其实根本都是一样的

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧