JAVA中list集合的排序
根据字符串的含义,进行对象化,比如,Student,有三个属性,序号,姓名,分数
注意重写Student的Compareable接口
然后,ListString变成ListStudent students=new ArrayListStudent
然后,遍历list,算出平均分,放入新的SortListStudent
打印结果
JAVA中list排序问题
分不多,不过正好我研究了这里,也算给自己做个总结:
我为了方便解释、写了一个测试类
/** test for reflex */
public class Model {
private String name;
private String content;
public Model(){
this.name = “my name”;
this.content = “a long text”;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getContent() {
return content;
}
//测试
public void test() throws Exception{
Model model = new Model();
Method m1 = model.getClass().getMethod(“getName”, null);
System.out.println(m1.invoke(model, null));
}
public static void main(String args[]){
try {
new Model().test(“getName”);
} catch (Exception e) {
e.printStackTrace();
}
}
}
首先调用test,传递一个method过去;
通过反射机制(这里用到了getMethod、invoke,我比较喜欢getField)、获取到m1对象的getName方法,getMethod第一个参数为方法名、第二个是给这个method的参数的类型,
If parameterTypes is null, it is treated as if it were an empty array,如果为null,表示没有参数;(即 getName()方法);
然后在通过 invoke 注入参数;第一个是相应对象的引用、第二个是参数值(刚刚的是类型,现在才是值);
If the underlying method is static, then the specified obj argument is ignored. It may be null,也就是说static的方法第一个参数是null;
我们要调用的是getName(),那么就是 m1.invoke(model,null)了;
执行结果为:my name ;相当于调用了getName()方法.
绕了一圈也就是 model.getName() == model.getClass().getMethod(“getName”,null).invoke(model,null);
对于有参数的,调整为
public void test(String method) throws Exception{
Model model = new Model();
Method m1 = model.getClass().getMethod(method, String.class);
m1.invoke(model, “can you”);
System.out.println(model.getName());
}
结果:can you
接下来上边的题目就简单了,
public void Sort(ListE list, final String method, final String sort){
这里给出了method,接下来是一个内部类的处理;自定义一个comparator,
Method m1 = ((E) a).getClass().getMethod(method, null);
这里就是获取method方法,他没有参数。
m1.invoke(((E)a), null).toString()
这里是得到对象a调用方法method之后的返回值。
ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());
而这里就是比较两个对象method方法的返回值
将ret交给sort进行排序;
就像3楼说的、真正排序的是sort方法,下面的只是对一个类中某个方法的返回值进行比较
java list 相同的字段排序
1. 集合类List存放的数据,默认是按照放入顺序排序的。我们也可以对list中某一个元素进行排序。例如;
package test.tool.gui.dbtool.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
2.创建3个学生对象,年龄分别是20、19、21,并将他们依次放入List中
Student s1 = new Student();
s1.setAge(20);
Student s2 = new Student();
s2.setAge(19);
Student s3 = new Student();
s3.setAge(21);
list.add(s1);
list.add(s2);
list.add(s3);
System.out.println(“排序前:”+list);
Collections.sort(list, new Comparator(){
public int compare(Student o1, Student o2) {
//按照学生的年龄进行升序排列
if(o1.getAge() o2.getAge()){
return 1;
}
if(o1.getAge() == o2.getAge()){
return 0;
}
return -1;
}
});
System.out.println(“排序后:”+list);
}
}
class Student{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return getAge()+””;
}
}
java 怎么将List里面数据排序
学生实体类,包含姓名和年龄属性,
比较时先按姓名升序排序,如果姓名相同则按年龄升序排序。
第一种:实体类自己实现比较
(实现comparable接口:public interface ComparableT ,里面就一个方法声明:public int compareTo(T o); )
然后利用List类的sort(Comparator? super E c)方法或java.util.Collections工具类的sort(ListT list) (其实里面就一句:list.sort(null); )进行排序:
结果:
第二种:借助比较器进行排序。
示例代码:
比较器java.util.Comparator类是一个接口(public interface ComparatorT ),包含int compare(T o1, T o2);等方法:
我们的比较器要实现该接口并实现compare方法:
比较的时候可以利用List的sort(Comparator? super E c)方法(或者java.util.Collections工具类的sort(ListT list, Comparator? super T c)方法)进行排序。
结果跟第一种方法一样:
java list 字符精确排序 例如: a1 a12 a13 a2 a3 排序后是:a1 a2 a3 a12 a13 ,不是a1 a12 a13 a2 a3
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
public static void main(String[] args) {
ListString list = new ArrayListString();
list.add(“3”);list.add(“a1”);list.add(“a12”);list.add(“a13”);list.add(“a2”);
list.add(“a3”);list.add(“c1”);list.add(“b2”);list.add(“d1”);
list.add(“b1”);list.add(“c3”);list.add(“2”);list.add(“1”);
System.out.println(“排序前——“+list);
Collections.sort(list, new ComparatorString() {
String regNum = “[\\d]”;//数字字符
String regStr = “[^\\d]”;//非数字字符
@Override
public int compare(String o1, String o2) {
int num1 = Integer.parseInt(o1.replaceAll(regStr, “”));
int num2 = Integer.parseInt(o2.replaceAll(regStr, “”));
String str1 = o1.replaceAll(regNum, “”);
String str2 = o2.replaceAll(regNum, “”);
//都有字母
if( ! isnull(str1) ! isnull(str2)){
if(str1.compareTo(str2) 0){
return 1;
}else if(str1.compareTo(str2) 0){
return -1;
}else{
return num1-num2;
}
}else{//存在数字
//都是数字
if(isnull(str1) isnull(str2)){
return num1 – num2;
}else if(isnull(str1) ! isnull(str2)){//数字排前面:o1是数字,o2不是数字
return -1;
}else if(! isnull(str1) isnull(str2)){//数字排前面:o1不是数字,o2是数字
return 1;
}else{
return 0;
}
}
}
});
System.out.println(“排序后======”+list);
}
private static boolean isnull(String str){
return str == null || str.trim().length() == 0;
}
}