java中list排序

Python09

java中list排序,第1张

第一种方法,就是list中对象实现Comparable接口,代码如下:

public class Person implements Comparable<Person>{

private String name

private Integer order

/**

* @return the name

*/

public String getName() {

return name

}

/**

* @param name

*the name to set

*/

public void setName(String name) {

this.name = name

}

/**

* @return the order

*/

public Integer getOrder() {

return order

}

/**

* @param order

*the order to set

*/

public void setOrder(Integer order) {

this.order = order

}

@Override

public int compareTo(Person arg0) {

return this.getOrder().compareTo(arg0.getOrder())

}

}

public static void main(String[] args) {

List<Person>listA = new ArrayList<Person>()

Person p1 = new Person()

Person p2 = new Person()

Person p3 = new Person()

p1.setName("name1")

p1.setOrder(1)

p2.setName("name2")

p2.setOrder(2)

p3.setName("name3")

p3.setOrder(3)

listA.add(p2)

listA.add(p1)

listA.add(p3)

Collections.sort(listA)

for (Person p : listA) {

System.out.println(p.getName())

}

}

第二种方法,就是在重载Collections.sort方法,代码如下:

public class Person {

private String name

private Integer order

/**

* @return the name

*/

public String getName() {

return name

}

/**

* @param name

*the name to set

*/

public void setName(String name) {

this.name = name

}

/**

* @return the order

*/

public Integer getOrder() {

return order

}

/**

* @param order

*the order to set

*/

public void setOrder(Integer order) {

this.order = order

}

}

public static void main(String[] args) {

List<Person>listA = new ArrayList<Person>()

Person p1 = new Person()

Person p2 = new Person()

Person p3 = new Person()

p1.setName("name1")

p1.setOrder(1)

p2.setName("name2")

p2.setOrder(2)

p3.setName("name3")

p3.setOrder(3)

listA.add(p2)

listA.add(p1)

listA.add(p3)

Collections.sort(listA, new Comparator<Person>() {

public int compare(Person arg0, Person arg1) {

return arg0.getOrder().compareTo(arg1.getOrder())

}

})

for (Person p : listA) {

System.out.println(p.getName())

}

}

两次执行的结果都是:

name1

name2

name3

1,使用Comparator 接口

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

}

})

}

}