昨天接到一个实习公司的电话面试,来的很突然,没有准备。

由于以前没用过,在被他问及是否用过JAVA的排序工具Comparable与Comparator时,没有回答上来,只能实话实说没有用过。

感觉太丢人了~~回去赶紧看看,现在将学到的东西记录下来,同大家分享~~

先说Comparable接口,public interface Comparable<T>。当需要根据类中的成员变量对类进行排序时,只需实现该接口,覆写compareTo方法即可非常方便~~

该接口中只有一个方法--int compareTo(T o);

在该方法中可以自己定义成员变量大小“规则”,这里举的例子是降序排列,该方法根据比较的结果(大于、等于、小于)返回整型(-1,0,1)。如下:

	@Override
public int compareTo(EnvironmentForm env) {
//大于所给温度则返回-1
if(this.temp>env.getTemp()){
return -1;
}else if(this.temp<env.getTemp()){
//小于所给温度返回1
return 1;
}else{
//大于所给湿度返回-1
if(this.hum>env.getHum()){
return -1;
//小于所给湿度返回1
}else if(this.hum<env.getHum()){
return 1;
}
}
return 0;
}

然后通过Arrays类的静态方法--public static void sort(),完成排序。

下面是具体的实现:

首先是自定义一个简单的环境类,包括成员变量(温度、湿度),实现Comparable接口;

public class EnvironmentForm implements Comparable<EnvironmentForm>{
/**温度*/
private float temp;
/**湿度*/
private float hum;
public float getTemp() {
return temp;
}
public void setTemp(float temp) {
this.temp = temp;
}
public float getHum() {
return hum;
}
public void setHum(float hum) {
this.hum = hum;
}
/**
* 无参构造
*/
public EnvironmentForm(){}
/**
* 有参构造
* @param temp 温度
* @param hum 湿度
*/
public EnvironmentForm(float temp, float hum) {
super();
this.temp = temp;
this.hum = hum;
}
@Override
public String toString() {
return "EnvironmentForm [温度=" + temp + ", 湿度=" + hum + "]\n";
}
@Override
public int compareTo(EnvironmentForm env) {
//大于所给温度则返回-1
if(this.temp>env.getTemp()){
return -1;
}else if(this.temp<env.getTemp()){
//小于所给温度返回1
return 1;
}else{
//大于所给湿度返回-1
if(this.hum>env.getHum()){
return -1;
//小于所给湿度返回1
}else if(this.hum<env.getHum()){
return 1;
}
}
return 0;
}
}

在主方法中实现温度的降序排列,当温度相等时,进行湿度的降序排列

package com.example;

import java.util.Arrays;
public class ComparaTestMain {
public static void main(String[] args) {
EnvironmentForm env[] = {new EnvironmentForm(27.5f,50.1f),
new EnvironmentForm(27.5f,60.1f),
new EnvironmentForm(27.5f,40.1f),
new EnvironmentForm(17.5f,50.1f),
new EnvironmentForm(37.5f,50.1f)};
System.out.println("********排序前********");
System.out.println(Arrays.toString(env));
System.out.println("********排序后********");
Arrays.sort(env);
System.out.println(Arrays.toString(env));
}
}

下面为运行结果:

********排序前********
[EnvironmentForm [温度=27.5, 湿度=50.1]
, EnvironmentForm [温度=27.5, 湿度=60.1]
, EnvironmentForm [温度=27.5, 湿度=40.1]
, EnvironmentForm [温度=17.5, 湿度=50.1]
, EnvironmentForm [温度=37.5, 湿度=50.1]
]
********排序后********
[EnvironmentForm [温度=37.5, 湿度=50.1]
, EnvironmentForm [温度=27.5, 湿度=60.1]
, EnvironmentForm [温度=27.5, 湿度=50.1]
, EnvironmentForm [温度=27.5, 湿度=40.1]
, EnvironmentForm [温度=17.5, 湿度=50.1]
]

JAVA排序(一) Comparable接口的更多相关文章

  1. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  2. Java基础 TreeSet()来实现数组的【定制排序】 : Comparable接口(自然排序) 或者 Comparator接口 (定制排序)

    笔记: //排序真麻烦!没有C++里的好用又方便!ORZ!ORZ!数组排序还还自己写个TreeSet()和( Comparable接口(自然排序) 或者 Comparator接口 (定制排序))imp ...

  3. Java中的Comparable接口和Comparator接口

    Comparator位于包java.util下,比较器,是在集合外部定义排序.Comparable位于包java.lang下,代表当前对象可比较的,是在集合内部实现排序. Comparable代表一个 ...

  4. TreeSet集合的自然排序与比较器排序、Comparable接口的compareTo()方法

    [自然排序] package com.hxl; public class Student implements Comparable<Student> { private String n ...

  5. Java中的comparable接口和Comparator接口的区别

    一.comparable和Comparator的区别 1.Comparable和Comparator都是用来实现集合中元素的比较.排序的. 2.Comparable是在类内部定义的方法实现的排序,位于 ...

  6. Java - 谨慎实现Comparable接口

    类实现了Comparable接口就表明类的实例本身具有内在的排序关系(natural ordering). 因此,该类可以与很多泛型算法和集合实现进行协作. 而我们之需要实现Comparable接口唯 ...

  7. Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

    一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个 ...

  8. java中的Comparable接口

    类对象之间比较"大小"往往是很有用的操作,比如让对象数组排序时,就需要依赖比较操作.对于不同的类有不同的语义.如Student类,比较2个学生对象可以比较他们的score分数来评判 ...

  9. java中实现Comparable接口实现自定义排序

    class Student implements Comparable{ String name; int gpa; @Override public int compareTo(Object arg ...

随机推荐

  1. 定时器——Cocos2d-x学习历程(十一)

    1.定时器 利用场景.层和精灵等游戏元素,我们可以构建游戏的框架,但是此时的游戏仍然是静止不动的.在一切游戏中,游戏的状态都会随着时间的流逝而改变,同时我们还需要定时进行一些逻辑判断,例如鱼和子弹的碰 ...

  2. iOS移动支付——支付宝支付

    这篇博客总结得很好,我只对在iOS上集成支付宝做简洁的步骤总结. http://www.it165.net/pro/html/201402/9376.html iOS集成支付宝支付的步骤: 准备工作的 ...

  3. Linux计划任务(转载)

    Linux计划任务(转载) Linux的计划任务是系统管理方面的一个重要内容,是系统自动完成工作的一种实现方式,正因为有了计划任务,我们才可以完全实现系统管理的脚本化和自动化. 关于计划任务,Linu ...

  4. GoF——抽象工厂模式

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.

  5. 全角和半角相互转换(C语言实现)

    目前,我们接触的汉字编码主要包括GBK和GB2312.其中,GB2312又称国标码,它是一个简化字的编码规范,也包括其他的符号.字母.日文假名等,共7445个图形字符,其中汉字占6763个.我们平时说 ...

  6. 关于Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟的问题

        今天看到一转帖如下: Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟 https://access.redhat.com/knowledge/solutions/ ...

  7. Linux主要发行版本介绍

    Linux主要发行版本介绍 1.Red Hat Linux Red Hat是一个比较成熟的Linux版本,无论在销售还是装机量上都比较可观.该版本从4.0开始同时支持Intel.Alpha及Sparc ...

  8. iOS中Blocks的介绍

    1. 什么是Blocks Blocks是C语言的扩充功能.如果用一句话来概括就是:带有自动变量的匿名函数. 第一次看见Blocks的时候,感觉很类似C语言的函数指针,尤其是Block类型变量,更是有极 ...

  9. append与after区别

    append() & prepend()实在元素内插入内容(该内容变成该元素的子元素或节点),after() & before()是在元素的外面插入内容(其内容变成元素的兄弟节点).

  10. 怎样通过css的media属性,适配不同分辨率的终端设备?

    怎样通过css的media属性,适配不同分辨率的终端设备,示比例如以下: <!DOCTYPE html> <html> <head> <title>首页 ...