参考文档:Java排序: Comparator vs Comparable 入门

java类经常面临排序问题,据我所知:java提供comparable和comparator两种比较方式:

1. comparable方法需要排序的类继承comparable接口,重写compareTo函数,但是只能实现一种对比方法(重写compareTo一次),例如:

类定义如下:

class Student implements Comparable<Student> {
private String name;
private String key;
private float score;
private int age; public Student(String key, String name, float score, int age) {
this.key = key;
this.name = name;
this.score = score;
this.age = age;
} @Override
/*
public int compareTo(Student ano) {
if (this.score < ano.score)
return -1;
if (this.score > ano.score)
return 1;
else {
if (this.age > ano.age)
return 1;
if (this.age < ano.age)
return -1;
else
return 0;
}//else
}//compareTo
*/
public int compareTo(Student ano){
return (int)(this.score - ano.score);
}
}

可以看到compareTo被我们重写,接下来我们可以运行排序,然后观察运行结果:

        Student stus[] = {new Student("lee","9527",22,80)
,new Student("zhang","1839",23,83)
,new Student("zhao","1284",21,80)};
print(stus);
Arrays.sort(stus);
System.out.println("after sorted:");
print(stus);

运行结果如下:

Student{name='9527', key='lee', score=22.0, age=80}
Student{name='1839', key='zhang', score=23.0, age=83}
Student{name='1284', key='zhao', score=21.0, age=80}
after sorted:
Student{name='1284', key='zhao', score=21.0, age=80}
Student{name='9527', key='lee', score=22.0, age=80}
Student{name='1839', key='zhang', score=23.0, age=83}

扩展:对元素是自定义类的List进行排序,自定List定义如下:

   public static List<Student> getStudents(){

        List<Student> col = new ArrayList<Student>();

        Random rand = new Random();
String valkey;
int valAge, valScore;
String valName;
for (int i = 0; i < 10; i++) {
valkey = UUID.randomUUID().toString();
valName = RandomStringUtils.random(10, 20, 110, true, true);
valAge = rand.nextInt(80);
valScore = rand.nextInt(80);
col.add(new Student(valkey,valName, valAge, valScore));
} return col;
}

通过Collections.sort(List)方法进行排序:

     List<Student> grade = Student.getStudents();
Iterator<Student> iter = grade.iterator();
Collections.sort(grade);
while(iter.hasNext()) {
//iter.next();
System.out.println(iter.next().toString());
}

2. 有时候我们需要对多种关键字进行排序,那么我们需要通过实现java.util.Comparator来实现,我们可以对类Student任何字段进行排序。我们不需要改变类Student,类本身不用实现java.lang.Comparable或者是java.util.Comparator接口,代码如下:

class studSortByName implements Comparator<Student> {
public int compare(Student st1, Student st2){
return st1.getName().compareTo(st2.getName());
}
}

接下来我们通过排序进行测验,我们必须使用Collections.sort(List, Comparator)这个方法而不是Collections.sort(List)方法:

public class ClassSort {
public static void main(String []args) {
//Student stu1 = new Student("wen", 90, 17);
//Student stu2 = new Student("mike", 90, 18);
//System.out.print("res:" + stu1.compareTo(stu2));
List<Student> grade = Student.getStudents();
Iterator<Student> iter = grade.iterator();
//Collections.sort(grade);
Collections.sort(grade,new StudSortByName());
while(iter.hasNext()) {
//iter.next();
System.out.println(iter.next().toString());
} /*Student stus[] = {new Student("lee","9527",22,80)
,new Student("zhang","1839",23,83)
,new Student("zhao","1284",21,80)};
print(stus);
Arrays.sort(stus);
System.out.println("after sorted:");
print(stus);
*/ } public static void print(Student [] stus){
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i].toString());
}
} }

附注可执行代码如下:

package comparable;

import java.util.*;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.builder.Diff; /**
* Created by carl on 11/7/15.
*/
class Student implements Comparable<Student> {
private String name;
private String key;
private float score;
private int age; public Student(String key, String name, float score, int age) {
this.key = key;
this.name = name;
this.score = score;
this.age = age;
} @Override
/*
public int compareTo(Student ano) {
if (this.score < ano.score)
return -1;
if (this.score > ano.score)
return 1;
else {
if (this.age > ano.age)
return 1;
if (this.age < ano.age)
return -1;
else
return 0;
}//else
}//compareTo
*/
public int compareTo(Student ano){
return (int)(this.score - ano.score);
} public static List<Student> getStudents(){ List<Student> col = new ArrayList<Student>(); Random rand = new Random();
String valkey;
int valAge, valScore;
String valName;
for (int i = 0; i < 10; i++) {
valkey = UUID.randomUUID().toString();
valName = RandomStringUtils.random(10, 20, 110, true, true);
valAge = rand.nextInt(80);
valScore = rand.nextInt(80);
col.add(new Student(valkey,valName, valAge, valScore));
} return col;
} public String getName(){
return name;
} public float getScore() {
return score;
} public int getAge() {
return age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", key='" + key + '\'' +
", score=" + score +
", age=" + age +
'}';
}
}//Student class StudSortByName implements Comparator<Student> {
public int compare(Student st1, Student st2){
return st1.getName().compareTo(st2.getName());
}
} public class ClassSort {
public static void main(String []args) {
//Student stu1 = new Student("wen", 90, 17);
//Student stu2 = new Student("mike", 90, 18);
//System.out.print("res:" + stu1.compareTo(stu2));
List<Student> grade = Student.getStudents();
Iterator<Student> iter = grade.iterator();
//Collections.sort(grade);
Collections.sort(grade,new StudSortByName());
while(iter.hasNext()) {
//iter.next();
System.out.println(iter.next().toString());
} /*Student stus[] = {new Student("lee","9527",22,80)
,new Student("zhang","1839",23,83)
,new Student("zhao","1284",21,80)};
print(stus);
Arrays.sort(stus);
System.out.println("after sorted:");
print(stus);
*/ } public static void print(Student [] stus){
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i].toString());
}
} }

java 类排序的更多相关文章

  1. Java最最常用的100个类排序(非官方)

    下面这句话是引用"大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库, ...

  2. Java各种排序算法详解

    排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插 ...

  3. java 集合排序(转)

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  4. java各种排序实现

    排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列. 对一个排序算法来说,一般从下面3个方面来衡量算法的优劣: 时间复杂度:它 ...

  5. 最最常用的 100 个 Java 类(转)

    大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个 ...

  6. 专题笔记--Java 类集框架

    Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...

  7. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  8. collection 中对类排序

    首先 写出 一个person类 让他继承Comparable 构造函数和get/set不用说 我们要覆盖父类中的comparto方法 代码如下 省略get/set package a; public ...

  9. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

随机推荐

  1. 总结:C#变量,占位符等相关知识

    新年耽误了不少时间,好久没认真的坐下来学习了,新年也快完了,又要开始正式学习了,按着视频教学学习,用了一天的时间,学习了下简单的变量及其相关的输入输出和应用,学了几种最基本的类型: int(整型) c ...

  2. WCF:System.Security.Cryptography.CryptographicException: 密钥集不存在

    WCF使用IIS部署时,使用x509证书验证,在创建证书并正确配置程序后,访问出现错误提示: System.Security.Cryptography.CryptographicException: ...

  3. package.json配置项

    以下示例列举了常用的地方,一些不常用的可以查看文档:文档地址 { //该模块名字 "name":"test" , //版本 "version" ...

  4. DataTable 修改列名 删除列 调整列顺序

    DataTable myDt =dt;//删除列myDt.Columns.Remove("minArea");myDt.Columns.Remove("maxArea&q ...

  5. c# 柱状图(转载)

    // c# 显示柱状图 using System; using System.Data; using System.Configuration; using System.Web; using Sys ...

  6. iOS 常用第三方

    MWPhotoBrowser 非常好用的图片浏览器 FDFullscreenPopGesture 用于全屏滑动切换视图 Aspects 用于快速AOP编程 AFNetworking iOS开发中最为火 ...

  7. C++学习之文件的输入输出

    C++学习之文件的输入输出        一.文件的打开与关闭        1.输出数据到文件        文件的操作需要包含fstream头文件,文件的操作对象为ifstream,ofstrea ...

  8. selenium css(转)

      如果button上有class属性的,如: <button id="ext-eng=1026" class="x-right-button"...&g ...

  9. hdu 3397 Sequence operation 线段树

    题目链接 给出n个数, 每个数是0或1, 给5种操作, 区间变为1, 区间变为0, 区间0,1翻转, 询问区间内1的个数, 询问区间内最长连续1的个数. 需要将数组开成二维的, 然后区间0, 1翻转只 ...

  10. 循环-21. 求交错序列前N项和

    /* * Main.c * C21-循环-21. 求交错序列前N项和 * Created on: 2014年8月18日 * Author: Boomkeeper ***********测试通过**** ...