java怎么对list进行排序

Python012

java怎么对list进行排序,第1张

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

}

})

}

}

用Collections.sort就可以排序,

里面的排序是默认的按自然顺序排列

也就是1,2,3,4这种

参数要求实现了Comparable的数据才能排序,

如果你自己写的类,你就要实现Comparable接口,然后在接口里面自动生成的方法里面

指定排序方法,一般的String Inteneger类都是实现了这个接口的 不用自己操作的。

你可以取看源代码

根据字符串的含义,进行对象化,比如,Student,有三个属性,序号,姓名,分数

注意重写Student的Compareable接口

然后,List<String>变成List<Student>students=new ArrayList<Student>

然后,遍历list,算出平均分,放入新的SortList<Student>

打印结果