Student类 结构如下:(省略getter,setter方法)
public class Student {
/***
* 姓名
*/
private String name
private int age
private String address
/***
* 考试得分
*/
private int score
//省略getter,setter方法
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score
+ "]"
}
}
测试方法:
@Test
public void test_ListComparator(){
List<Student>students=new ArrayList<Student>()
Student stu=null
stu=new Student()
stu.setName("whuang")
stu.setAge(12)
stu.setScore(80)
students.add(stu)
stu=new Student()
stu.setName("rong")
stu.setAge(11)
stu.setScore(90)
students.add(stu)
stu=new Student()
stu.setName("zhu")
stu.setAge(15)
stu.setScore(100)
students.add(stu)
Collections.sort(students,new SystemHWUtil. ListComparator(true,"age"))
System.out.println(students)
}
运行结果:
[Student [name=rong, age=11, score=90], Student [name=whuang, age=12, score=80], Student [name=zhu, age=15, score=100]]
核心类:
public static class ListComparator implements Comparator{
/***
* 是否转化为Int之后再比较
*/
private boolean isConvertInteger
/***
* 对哪个列进行排序
*/
private String comparedProperty
public ListComparator(boolean isConvertInteger,String comparedProperty) {
super()
this.isConvertInteger = isConvertInteger
this.comparedProperty=comparedProperty
}
public int compare(Object o1, Object o2) {
if(null!=o1&&null!=o2)
{
try {
Object obj1=ReflectHWUtils.getObjectValue(o1, comparedProperty)
Object obj2=ReflectHWUtils.getObjectValue(o2, comparedProperty)
if(isConvertInteger){
int num1
int num2
if(obj1 instanceof Integer){
num1=(Integer)obj1
num2=(Integer)obj2
}else{
num1=Integer.parseInt(obj1.toString())
num2=Integer.parseInt(obj2.toString())
}
if(num1>num2){
return 1
}else if(num1<num2){
return -1
}else{
return 0
}
}else{
return obj1.toString().compareTo(obj2.toString())
}
} catch (SecurityException e) {
e.printStackTrace()
} catch (NoSuchFieldException e) {
e.printStackTrace()
} catch (IllegalArgumentException e) {
e.printStackTrace()
} catch (IllegalAccessException e) {
e.printStackTrace()
}
}
return 0/*等于*/
}
}
2,可以指定是升序还是降序
实例:
@Test
public void test_ListComparator(){
List<Student>students=new ArrayList<Student>()
Student stu=null
stu=new Student()
stu.setName("whuang")
stu.setAge(12)
stu.setScore(80)
students.add(stu)
stu=new Student()
stu.setName("rong")
stu.setAge(11)
stu.setScore(90)
students.add(stu)
stu=new Student()
stu.setName("zhu")
stu.setAge(15)
stu.setScore(100)
students.add(stu)
SortList<Student>sortList = new SortList<Student>()
sortList.Sort(students, "getAge", "asc")
System.out.println(students)
}
注意:sortList.Sort 的第二个参数是方法名,不是成员变量名.
核心代码
package com.common.util
import java.lang.reflect.InvocationTargetException
import java.lang.reflect.Method
import java.util.Collections
import java.util.Comparator
import java.util.List
public class SortList<E>{
public void Sort(List<E>list, final String method, final String sort) {
Collections.sort(list, new Comparator() {
public int compare(Object a, Object b) {
int ret = 0
try {
Method m1 = ((E) a).getClass().getMethod(method, null)
Method m2 = ((E) b).getClass().getMethod(method, null)
if (sort != null &&"desc".equals(sort))// 倒序
ret = m2.invoke(((E) b), null).toString()
.compareTo(m1.invoke(((E) a), null).toString())
else
// 正序
ret = m1.invoke(((E) a), null).toString()
.compareTo(m2.invoke(((E) b), null).toString())
} catch (NoSuchMethodException ne) {
System.out.println(ne)
} catch (IllegalAccessException ie) {
System.out.println(ie)
} catch (InvocationTargetException it) {
System.out.println(it)
}
return ret
}
})
}
}
compareTo只是比较2个字符串,不能进行排序
String
s1
=
"abc"
String
s2
=
"abcd"
String
s3
=
"abcdfg"
String
s4
=
"1bcdfg"
String
s5
=
"cdfg"
String
s6="abc"
System.out.println(
s1.compareTo(s2)
)
//
-1
(前面相等,s1长度小1)
System.out.println(
s1.compareTo(s3)
)
//
-3
(前面相等,s1长度小3)
System.out.println(
s1.compareTo(s4)
)
//
48
("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
System.out.println(
s1.compareTo(s5)
)
//-2
System.out.println(
s1.compareTo(s6)
)
//
0
比较方法其实就是对字符串中的字符逐个比较ASCII
值相减,如果2个字符串是包含关系返回长度差。Collections.sort方法才是对LIST
进行排序的方法。
用Collections.sort就可以排序,里面的排序是默认的按自然顺序排列
也就是1,2,3,4这种
参数要求实现了Comparable的数据才能排序,
如果你自己写的类,你就要实现Comparable接口,然后在接口里面自动生成的方法里面
指定排序方法,一般的String Inteneger类都是实现了这个接口的 不用自己操作的。
你可以取看源代码