代码对list集合使用关键字检索和排序

代码对list集合使用关键字检索和排序

在我们有时候从服务器中获取到的一些集合,在本地需要某个字段或多个字段进行检索,方法其实也很多,我最直接的想法就是存本地数据库然后通过sql条件进行查询。这个想法可能跟我的工作相关吧,项目经常会用到本地数据库,但是对于使用数据库我会觉得麻烦,要建本地表升级还要控制数据库版本,而且只是简单的关键字检索,所以感觉没必要,然后我就像直接在页面上遍历结果。当然这种只适合少量数据

这里我就记录下方便以后可以回来看看

public class MySearchList<E> {

    public List<E> searchByMethod(List<E> list, String method1, String method2,String keyString) {
        List results = new ArrayList();
        try {
            Pattern pattern = Pattern.compile(keyString);
            for (int i = 0; i < list.size(); i++) {
                Method m1 = ((E)list.get(i)).getClass().getMethod(method1, (Class<?>[]) null);
                Object obj1 = m1.invoke((list.get(i)), (Object[]) null);
                Method m2 = ((E) list.get(i)).getClass().getMethod(method2, (Class<?>[]) null);
                Object obj2 = m2.invoke((list.get(i)), (Object[]) null);

                Matcher matcher1 = pattern.matcher(obj1.toString());
                Matcher matcher2 = pattern.matcher(obj2.toString());
                if (matcher1.find() || matcher2.find()) {
                    results.add(list.get(i));
                }
            }
        } catch (NoSuchMethodException nsme) {
            nsme.printStackTrace();
        } catch (IllegalAccessException iae) {
            iae.printStackTrace();
        } catch (InvocationTargetException ite) {
            ite.printStackTrace();
        }
        return results;
    }
}

这里我自己写了个半公用的关键字检索的代码,有待改善。先记录下
直接传自己要检索的对象集合,然后传输关键字的get方法名进去,这里我只写了两个,如果多个的话这个方法就需要改一下了,最后个参数就是传入关键字。
具体用法很简单的

 MySearchList<ISAStoreModel> in = new MySearchList<>();          storeAdapter.replaceData(in.searchByMethod(storeList, "getStoreName", "getStoreCode", s.toString()));

这里截取的代码块。

顺便我再贴一个使用代码排序的方法,类似的写法。

public class MySortList<E> {
 /**
     * 对列表中的数据按指定字段进行排序。要求类必须有相关的方法返回字符串、整型、日期等值以进行比较。
     *
     * @param list
     * @param method
     * @param isStringNum  是否是数字类型的字符串
     * @param reverseFlag
     */
    public void sortByMethod(List<E> list, final String method,boolean isStringNum,final boolean reverseFlag) {
        Collections.sort(list, new Comparator<Object>() {
            @SuppressWarnings("unchecked")
            public int compare(Object arg1, Object arg2) {
                float result = 0;
                try {
                    Method m1 = ((E) arg1).getClass().getMethod(method, (Class<?>[]) null);
                    Method m2 = ((E) arg2).getClass().getMethod(method, (Class<?>[]) null);
                    Object obj1 = m1.invoke((arg1), (Object[]) null);
                    Object obj2 = m2.invoke((arg2), (Object[]) null);
                    if (obj1 instanceof String) {
                        // 字符串
                        if (isStringNum){
                            if (TextUtils.isEmpty((String) obj1)){
                                result = reverseFlag ? -1 : 1;
                            }else if (TextUtils.isEmpty((String) obj2)){
                                result = reverseFlag ? 1 : -1;
                            }else {
                                int num1 = Integer.valueOf((String) obj1);
                                int num2 = Integer.valueOf((String) obj2);
                                result =  num1-num2;
                            }
                        }else {
                            result = obj1.toString().compareTo(obj2.toString());
                        }

                    } else if (obj1 instanceof Date) {
                        // 日期
                        long l = ((Date) obj1).getTime() - ((Date) obj2).getTime();
                        if (l > 0) {
                            result = 1;
                        } else if (l < 0) {
                            result = -1;
                        } else {
                            result = 0;
                        }
                    } else if (obj1 instanceof Integer) {
                        // 整型(Method的返回参数可以是int的,因为JDK1.5之后,Integer与int可以自动转换了)
                        result = (Integer) obj1 - (Integer) obj2;
                    } else if (obj1 instanceof Float) {
                        // 整型(Method的返回参数可以是int的,因为JDK1.5之后,Integer与int可以自动转换了)
                        result = (float) obj1 - (float) obj2;
                    } else {
                        // 目前尚不支持的对象,直接转换为String,然后比较,后果未知
                        result = obj1.toString().compareTo(obj2.toString());

                        System.err.println("MySortList.sortByMethod方法接受到不可识别的对象类型,转换为字符串后比较返回...");
                    }

                    if (reverseFlag) {
                        // 倒序
                        result = -result;
                    }
                } catch (NoSuchMethodException nsme) {
                    nsme.printStackTrace();
                } catch (IllegalAccessException iae) {
                    iae.printStackTrace();
                } catch (InvocationTargetException ite) {
                    ite.printStackTrace();
                }

                return (int) result;
            }
        });
    }
    }

这里我就不具体说明了,代码一样很简单,易懂。这个是排序的。

坚持记录,种草!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值