Java集合中对象排序
集合中的对象排序需求还是比較常见的。当然我们能够重写equals方法,循环比較;同一时候Java为我们提供了更易使用的APIs。当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparator或Comparable。以简单的方式实现对象排序或自己定义排序。
以下通过两个样例分别用Comparable和Comparator实现对User对象中年龄排序。
Comparable接口方式
import java.util.Arrays;
public class ComparableUser implements Comparable { private String id;
private int age; public ComparableUser(String id, int age) {
this.id = id;
this.age = age;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public int compareTo(Object o) {
return this.age - ((ComparableUser) o).getAge();
} /**
* 測试方法
*/
public static void main(String[] args) {
ComparableUser[] users = new ComparableUser[] {
new ComparableUser("u1001", 25),
new ComparableUser("u1002", 20),
new ComparableUser("u1003", 21) };
Arrays.sort(users);
for (int i = 0; i < users.length; i++) {
ComparableUser user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
} }
Comparator接口方式
public class User {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
import java.util.Arrays;
import java.util.Comparator;
public class UserComparator implements Comparator { public int compare(Object arg0, Object arg1) {
return ((User) arg0).getAge() - ((User) arg1).getAge();
} /**
* 測试方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("u1001", 25),
new User("u1002", 20), new User("u1003", 21) };
Arrays.sort(users, new UserComparator());
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}
总结
那么我们选择哪种方式,选择Comparable接口还是Comparator?
假设一个类实现了Comparable接口,则表明这个类的对象之间是能够相互比較的,这个类对象组成的集合就能够直接使用sort方法排序。
而Comparator能够看成一种算法的实现。将算法和数据分离。Comparator也能够在以下两种环境下使用:
- 设计时没有考虑比較问题而没有实现Comparable。能够通过Comparator来实现排序而不必改变对象本身
- 能够使用多种排序标准,比方升序、降序等。
Java集合中对象排序的更多相关文章
- Android集合中对象排序
如果将集合中的对象进行排序,最近使用了一个简单的方法解决了,随笔记下来. 主要思路: 首先,新建类实现Comparator<?>,这个类是做比较的关键类,一般做比较的类型 int 或 St ...
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...
- java中compareTo和compare方法之比较,集合中对象的比较
前言 转自:http://www.cnblogs.com/yueliming/archive/2013/05/22/3092576.html (这里做了一些小改动) 一直一来对集合中对象的比较方案,有 ...
- List集合中元素排序
应用场景: 在开发中经常遇到要对List<Object>集合进行排序,并且是根据集合中的对象的某个属性来进行排序 --------以下就此做出的解决方案 public static ...
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
- Java集合中List、Set以及Map
概述: List , Set, Map都是接口:List , Set继承至Collection接口,Map为独立接口 Set下有HashSet,LinkedHashSet,TreeSet List下有 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...
- Java集合中Set的常见问题及用法
在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法. Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称 ...
随机推荐
- Create a custom configSection in web.config or app.config file
config file: <?xml version="1.0" encoding="utf-8" ?> <configuration> ...
- Shader程序中内置的状态变量
经常在着色器程序需要访问一些全局状态,像当前的 model view projection 矩阵,当前环境的颜色诸如此类. 内置的矩阵 UNITY_MATRIX_MVP:当前模型 视窗 投影矩阵 UN ...
- handlebar.js使用
官方网站:http://handlebarsjs.com/ 下载及查看使用帮助,或者用百度cdn引用 一.定义模板 <script id="entry-template" t ...
- linux下安卓编译apk环境搭建
ubuntu下linux安卓编译环境搭建. 配置好编译环境 (前提是已经安装了jdk,可以用java -verison 命令查看) 一.设置环境变量 用vi ~/.bashrc 打开编译环境 JA ...
- js常用的一些正则验证文本框
只允许输入数字和-onKeyUp="value=value.replace(/[^-\d]/g,'')" onafterpaste="value=value.replac ...
- 虚拟机ping不通主机
centos ping不通主机 首先检查网络设备 ifconfig -a 如果有eth0 , 又存在 eth1 . 那么service eth1 stop 然后在ping主机.(以上前提是网络地址设 ...
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...
- [LeetCode]题解(python):087-Scramble String
题目来源: https://leetcode.com/problems/scramble-string/ 题意分析: 给定一个字符串,字符串展成一个二叉树,如果二叉树某个或多个左右子树颠倒得到的新字符 ...
- ThinkPHP 3.1.2 模板中的变量
一.变量输出 (重点) 1.标量输出 2.数组输出 {$name[1]} {$name['k2']} {$name.k1} 3.对象输出 {$name:k} {$name->k} 二.系统变量 ...
- 制作cdlinux u盘启动
U盘一个 CDlinux的iso镜像文件 UltraISO grub4dos grubinst 方法/步骤1 1 [第一步]:用UltraISO把CDlinux的镜像刻录进U盘. 打开UltraISO ...