java 类排序
参考文档: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 类排序的更多相关文章
- Java最最常用的100个类排序(非官方)
下面这句话是引用"大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库, ...
- Java各种排序算法详解
排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插 ...
- java 集合排序(转)
Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...
- java各种排序实现
排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列. 对一个排序算法来说,一般从下面3个方面来衡量算法的优劣: 时间复杂度:它 ...
- 最最常用的 100 个 Java 类(转)
大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个 ...
- 专题笔记--Java 类集框架
Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- collection 中对类排序
首先 写出 一个person类 让他继承Comparable 构造函数和get/set不用说 我们要覆盖父类中的comparto方法 代码如下 省略get/set package a; public ...
- Java集合排序及java集合类详解--(Collection, List, Set, Map)
1 集合框架 1.1 集合框架概述 1.1.1 容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...
随机推荐
- 在线词典php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 常用的连接字符串(vs中连接sqlserver)方便随时查看
Sql Server身份验证有两种,一种是Windows身份验证,还有一种是Sql Server 身份验证 Windows身份验证连接字符串: string connectionString = &q ...
- ExtJS4.2学习(二)——入门基础
1.工程的目录结构: src里放后台的文件,WebRoot里放前台的文件. index.html或者index.jsp等是整个项目的首页,在首页我们要引入ExtJS的CSS样式文件和ExtJS的核心类 ...
- BOOL、sizeof
BOOL使用前需要声明 #include <stdbool.h>(这个头文件定义了bool,true,false等宏) int a[5]; sizeof(a[5]),sizeof是关键字, ...
- hdu 2565 放大的X
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2565 这个题很简单 但是很容易错,写来给自己一个警示把 首先在最后一个x后面没有空格,然后就是那个换行一 ...
- linux 怎么查找oracle11g的安装目录
一般来说,/etc/oraInst.loc文件里会记录oracle的路径,如[oracle@ruby ~]$ cat /etc/oraInst.loc inventory_loc=/u01/app/o ...
- Groovy在不同JDK版本下的性能差异
Groovy作为一种动态语言,性能和JAVA比肯定是差不少,根据网友的测试,由于测试环境,场景和编译参数的不同,大概有差2到7倍的差距 那么同样的Groovy,在不同的JDK版本下,会有着怎样的差异呢 ...
- 产品在焊接时出现异常,尤其是尺寸较大的QFP芯片,焊接后出现虚焊、冷焊、假焊等问题?
1 不良描述 客户采用我们提供的SMT设备后,部分产品在焊接时出现异常,尤其是尺寸较大的QFP芯片,焊接后出现虚焊.冷焊.假焊等不良.应客户要求对这一批不良产品以及生产条件进行分析,以便找到改善的依据 ...
- NPO贴片电容容量范围对照表
NPO贴片电容简述 NPO(COG)贴片电容属于Class 1温度补偿型电容.它的容量稳定,几乎不随温度.电压.时间的变化而变化.尤其适用于高频电子电路. NPO(COG)贴片电容特性 具有最高的电容 ...
- 红外摄像头为什么使用850nm波长红外发射管
市面上有很多不同波长的红外发射管,其中以850nm和940nm波长为主.那么红外摄像头为什么使用850nm波长红外发射管? 首先,我们来了解一下红外摄像头的相关知识.简单来说红外摄像头是用来感应红外线 ...