JAVA 菜鸟 问一个菜鸟问题 list 的排序问题

简化一下 list 情况
比如 一个 student 类
只有两个参数 学号 sno 和 成绩 grade
现全放入 ArrayList中
如何按成绩 将 学生对象排序
实现目标如下即可
002 97
003 95
001 90
求各位路过大神 不吝指教后生

冒泡等基本排序算法可以解决这个问题

先自己定义一个对比的方法类

 class MyIntComparator implements Comparator{

 public int compare(Object o1, Object o2) {
  int  i1 = ((Student )o1).getScore();
  int i2 = ((Student )o2).getScore();
  if (i1 < i2){
   return 1;
  }
  if (i1 > i2){
   return -1;
  }
  return 0;
 }
}

调用:

 //下面将list的元素按降序排列
 list.add(s1);
 list.add(s2);
  Collections.sort(list, new MyIntComparator());

建议直接学习google的guava包了,里面提供了强大的流畅风格比较器。

下面是个例子。更多你可以看http://ifeve.com/google-guava-ordering/

 import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;

import java.util.List;

/**
 * Created by leeyee.li on 2015/9/20.
 */
public class OrderTest {

    public static final Ordering<Student> ORDER_BY_GRADE = Ordering.natural().onResultOf(new Function<Student, Comparable>() {
        @Override
        public Comparable apply(Student input) {
            return input.grade;
        }
    });

    public static void main(String[] args) {
        List<Student> students = Lists.newArrayList(
                new Student("001", 90),
                new Student("002", 97),
                new Student("003", 95)
        );
        System.out.println("排序前:" + students);
        System.out.println("顺序排序后:" + ORDER_BY_GRADE.sortedCopy(students));
        System.out.println("倒序排序后:" + ORDER_BY_GRADE.reverse().sortedCopy(students));
        System.out.println("最小对象:" + ORDER_BY_GRADE.min(students));
        System.out.println("最大对象:" + ORDER_BY_GRADE.max(students));
    }

}

class Student {
    String sno;
    Integer grade;

    public Student() {
    }

    public Student(String sno, Integer grade) {
        this.sno = sno;
        this.grade = grade;
    }

    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public Integer getGrade() {
        return grade;
    }

    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Student{");
        sb.append("sno='").append(sno).append('\'');
        sb.append(", grade=").append(grade);
        sb.append('}');
        return sb.toString();
    }
}

这个问题还是使用基本的方法吧,学习下Comparator接口的相关知识,或者直接使用林炳文的代码。

我记得有个.sort方法可以,不过建议你使用算法完成

最少代码实现, 其实跟上面一个道理

 Collections.sort(studentList, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getGrade().compareTo(o2.getGrade());
            }
        });

取出来的时候对分数进行排序后放入list,在循环获取就行

推荐yongxu_16方法,尽量使用JDK提供的方法,测试量小,不容易出错,性能上也不会太差。
如果没有特殊性能要求,你的数据也没有太大特性,那么为什么不用官方提过的方法呢。