代码对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;
}
});
}
}
这里我就不具体说明了,代码一样很简单,易懂。这个是排序的。
坚持记录,种草!