利用泛型和反射对任意List进行规格排序和整理

Android项目中我们常常需要封装一些方便于开发项目的工具类,最近笔者项目中需要对List集合进行排序,归类整理等需求,以前笔者的写法就是为每一个List里面元素的每一个属性写一个排序算法,当然Set集合做到排序很方便,但是Set集合有一点就是不能放入重复的元素。因此,为了让代码变得方便高雅一点,笔者对Java泛型和反射进行充分的研究,于是封装了一个ListUtils类,它可以做到对任何元素的任何属性进行排序,归类整理,当然这个属性必须是八大基本类型加String类型,闲话不多说,咱们直接上代码:

对任意的List集合进行排序,笔者使用的冒泡排序,如果你想用其它的,请自行更改,关键是要学会自己封装:

/**
 * 可以对任意的List集合进行排序
 * @param list 要排序的集合
 * @param sortShuXing 要排序的对应的属性,比如:学生的年龄
 * @param <T> 泛型对应元素的类型
 * @return 排序完成之后的List集合
 */
public <T> List<T> sortAnyList(List<T> list, String sortShuXing) {

    if (list == null||list.size() == 0) {
        return list;
    }

    Field byteField1 = null;
    String shuXingType = "";

    try {

        byteField1 = list.get(0).getClass().getDeclaredField(sortShuXing);
        shuXingType = byteField1.getType().getName();
        byteField1.setAccessible(true);

    } catch (NoSuchFieldException | SecurityException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    for (int i = 0; i < list.size() - 1; i++) {

        for (int j = i + 1; j < list.size(); j++) {

            try {

                switch (shuXingType) {

                case "byte":
                case "short":
                case "int":
                case "long":
                case "char":

                    long b1 = 0;
                    long b2 = 0;
                    b1 = byteField1.getLong(list.get(i));
                    b2 = byteField1.getLong(list.get(j));

                    if (b1 >= b2) {

                        T t = list.get(i);

                        list.set(i, list.get(j));

                        list.set(j, t);
                    }

                    break;

                case "float":

                case "double":

                    double d1 = 0;
                    double d2 = 0;
                    d1 = byteField1.getDouble(list.get(i));
                    d2 = byteField1.getDouble(list.get(j));

                    if (d1 >= d2) {

                        T t = list.get(i);

                        list.set(i, list.get(j));

                        list.set(j, t);
                    }

                    break;

                case "String":

                    String s1 = "";
                    String s2 = "";
                    s1 = (String) byteField1.get(list.get(i));
                    s2 = (String) byteField1.get(list.get(j));

                    System.out.println(s1 + ":" + s2);



                    break;

                    default:

                        if(byteField1.getType() == Byte.class ){
                            Byte byte1 = (Byte) byteField1.get(list.get(i));
                            Byte byte2 = (Byte) byteField1.get(list.get(j));
                            if(byte1.byteValue() >= byte2.byteValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }
                        }else if(byteField1.getType() == Short.class){
                            Short short1 = (Short) byteField1.get(list.get(i));
                            Short short2 = (Short) byteField1.get(list.get(j));
                            if(short1.shortValue() >= short2.shortValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }
                        }else if(byteField1.getType() == Integer.class){
                            Integer integer1 = (Integer) byteField1.get(list.get(i));
                            Integer integer2 = (Integer) byteField1.get(list.get(j));
                            if(integer1.intValue() >= integer2.intValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }
                        }else if(byteField1.getType() == Long.class){
                            Long long1 = (Long) byteField1.get(list.get(i));
                            Long long2 = (Long) byteField1.get(list.get(j));
                            if(long1.longValue() >= long2.longValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }
                        }else if(byteField1.getType() == Float.class){
                            Float float1 = (Float) byteField1.get(list.get(i));
                            Float float2 = (Float) byteField1.get(list.get(j));
                            if(float1.floatValue() >= float2.floatValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }
                        }else if(byteField1.getType() == Double.class){
                            Double double1 = (Double) byteField1.get(list.get(i));
                            Double double2 = (Double) byteField1.get(list.get(j));
                            if(double1.doubleValue() >= double2.doubleValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }
                        }else if(byteField1.getType() == Character.class){
                            Character character1 = (Character) byteField1.get(list.get(i));
                            Character character2 = (Character) byteField1.get(list.get(j));
                            if(character1.charValue() >= character2.charValue()){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }

                        }else if(byteField1.getType() == String.class){
                            String string1 = (String) byteField1.get(list.get(i));
                            String string2 = (String) byteField1.get(list.get(j));

                            int length = string1.length()<=string2.length()?string1.length():string2.length();
                            boolean falg = false;

                            for(int m=0;m<length;m++){

                                if(string1.charAt(m) > string2.charAt(m)){
                                    falg = true;
                                    break;
                                }else if(string1.charAt(m) < string2.charAt(m)){
                                    falg = false;
                                    break;
                                }

                                if(m == length-1&&!falg){
                                    falg = string1.length()>=string2.length()?true:false;
                                }

                            }

                            if(falg){
                                T t = list.get(i);

                                list.set(i, list.get(j));

                                list.set(j, t);
                            }


                        }

                }

            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    return list;

}

归类整理算法:

/**
 * @param traget 要整理的目标集合 比如:List<Music>
 * @param tragetShuXingName 要整理的目标集合内部元素对应的属性名字 比如:singerName
 * @param resultClass 整理成什么样的类型 比如:Singer.class
 * @param resultShuxingName 整理类型对应的属性名字 比如:name
 * @param resultListShuXingName 整理后的集合 比如:musics
 * @param <T> 被整理的集合的内部元素类型 比如:Singer
 * @param <E> 整理后的集合的内部元素类型 比如:Music
 * @return 返回整理完成后的集合,比如:List<Singer>
 */

public <T,E> List<T> zhengLi(List<E> traget,String tragetShuXingName,Class resultClass,String resultShuxingName,String resultListShuXingName){

    List<T>  results = new ArrayList<>();

    if(traget == null || traget.size() == 0){
        return  null;
    }
    Field field= null;
    try {
        field = traget.get(0).getClass().getDeclaredField(tragetShuXingName);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }

    for(int i = 0;i<traget.size();i++){
        //这个地方获取目标的值
        try {
            switch (field.getType().getName()) {

                case "byte":
                case "short":
                case "int":
                case "long":
                case "char":


                    break;

                case "float":

                case "double":


                    break;

                case "String":






                    break;

                default:

                    if (field.getType() == Byte.class) {

                    } else if (field.getType() == Short.class) {

                    } else if (field.getType() == Integer.class) {

                    } else if (field.getType() == Long.class) {

                    } else if (field.getType() == Float.class) {

                    } else if (field.getType() == Double.class) {

                    } else if (field.getType() == Character.class) {


                    } else if (field.getType() == String.class) {



                        String s1 = "";
                        s1 = (String) field.get(traget.get(i));

                        boolean isNewAdd = true;
                        T t = null;
                        for(int j = 0;j<results.size();j++){
                            //比较结果集合中是否存在这个元素
                            t = results.get(j);
                            String resultValue = (String) t.getClass().getDeclaredField(resultShuxingName).get(results.get(j));
                            if((s1!=null&&resultValue!=null)&&s1.equals(resultValue)){
                                isNewAdd = false;
                                //得到t的e整理集合
                                List<E> eList = (List<E>) t.getClass().getDeclaredField(resultListShuXingName).get(results.get(j));
                                eList.add(traget.get(i));
                                break;
                            }
                        }

                        if(isNewAdd){
                            //添加这个元素到目标元素
                            t = (T) resultClass.newInstance();

                            List<E> eList = new ArrayList<>();
                            eList.add(traget.get(i));

                            Field field1 = t.getClass().getDeclaredField(resultListShuXingName);

                            field1.set(t,eList);

                            Field field2 = t.getClass().getDeclaredField(resultShuxingName);

                            field2.set(t,s1);

                            results.add(t);
                        }

                    }

            }
        }catch (IllegalAccessException e){

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }


    }

    return results;
}

以上整理算法,目前笔者只写了String类型的整理,其它的写上感觉没什么用途意义,如果有需要,请自行添加逻辑。下面是Demo:
链接:https://pan.baidu.com/s/1yj1tyz7-VcCqRuMv42i1FA 密码:2fks

猜你喜欢

转载自blog.csdn.net/ClAndEllen/article/details/80911730