Java线性表的排序
Java线性表的排序
前言:刚才在弄JDBC的时候,忽然觉得order-by用太多了没新鲜感,我的第六感告诉我java有对线性表排序的封装,然后在eclipse里随便按了一下“.” ,哈哈,竟然真有这么一个静态方法public static <T> void sort(List<T> list, Comparator<? super T> c)。
修改记录:根据@mythabc的的建议,添加了另一种方式。
方式一:Comparator比较器
好处:这种方式运行的时候比较灵活,如果要更换排序规则,不更改原有的比较器,而直接新建另一个比较器,在客户端换一下比较器的新类名就行了,这样比较贴近开闭原则,当累积了多个比较器后,各种排序规则可以随意转换,挺爽的;模型与排序分离,比较贴近单一职责原则。
1.先定义一个模型:
package model; public class User
{
private String userName;
private int userAge; public User()
{
} public User(String userName, int userAge)
{
this.userName = userName;
this.userAge = userAge;
} public String getUserName()
{
return userName;
} public void setUserName(String userName)
{
this.userName = userName;
} public int getUserAge()
{
return userAge;
} public void setUserAge(int userAge)
{
this.userAge = userAge;
}
}
2.然后定义一个比较器,实现java.util.Comparator接口,在compare()方法编写比较规则:
package util; import java.util.Comparator; import model.User; public class ComparatorUser implements Comparator<User>
{
@Override
public int compare(User arg0, User arg1)
{
// 先比较名字
int flag = arg0.getUserName().compareTo(arg1.getUserName());
// 如果名字一样,就比较年龄
if (flag == 0)
{
return arg0.getUserAge() - arg1.getUserAge();
}
return flag;
}
}
3.排序的时候用java.util.Collections里面的sort(List list, Comparator c)方法:
package test; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import util.ComparatorUser;
import model.User; public class TestApp
{
public static void main(String[] arg0)
{
List<User> userList = new ArrayList<User>(); // 插入数据
userList.add(new User("A", 15));
userList.add(new User("B", 14));
userList.add(new User("A", 14)); // 排序
Collections.sort(userList, new ComparatorUser()); // 打印结果
for (User u : userList)
{
System.out.println(u.getUserName() + " " + u.getUserAge());
}
}
}
4.运行结果:
A 14
A 15
B 14
方式二:实现Comparable接口
好处:直接让模型附带可排序的属性,不用去定义新的类(不用定义比较器),减少了类的数量,方便管理,阅读的时候比较轻松。
1.先定义一个模型,并实现Comparable接口,在compareTo()方法编写比较规则:
package model; public class Student implements Comparable<Student>
{
private String studentName;
private int studentAge; public Student()
{
} public Student(String studentName, int studentAge)
{
this.studentName = studentName;
this.studentAge = studentAge;
} public String getStudentName()
{
return studentName;
} public void setStudentName(String studentName)
{
this.studentName = studentName;
} public int getStudentAge()
{
return studentAge;
} public void setStudentAge(int studentAge)
{
this.studentAge = studentAge;
} @Override
public int compareTo(Student o)
{
// 先比较名字
int flag = this.getStudentName().compareTo(o.getStudentName()); // 如果名字一样,就比较年龄
if (flag == 0)
{
return this.getStudentAge() - o.getStudentAge();
}
return flag;
}
}
2.排序的时候用java.util.Collections里面的sort(List list)方法:
package test; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import model.Student; public class TestApp2
{
public static void main(String[] arg0)
{
List<Student> studentList = new ArrayList<Student>(); // 插入数据
studentList.add(new Student("A", 15));
studentList.add(new Student("B", 14));
studentList.add(new Student("A", 14)); // 排序
Collections.sort(studentList); // 打印结果
for (Student s : studentList)
{
System.out.println(s.getStudentName() + " " + s.getStudentAge());
}
}
}
3.运行结果:
A 14
A 15
B 14
Java线性表的排序的更多相关文章
- Java 线性表、栈、队列和优先队列
1.集合 2.迭代器 例子: 3.线性表 List接口继承自Collection接口,有两个具体的类ArrayList或者LinkedList来创建一个线性表 数组线性表ArrayList Linke ...
- 数据结构与算法分析java——线性表1
说到线性结构的话,我们可以根据其实现方式分为三类: 1)顺序结构的线性表 2)链式结构的线性表 3)栈和队列的线性表 应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有&qu ...
- java线性表之顺序表实现
仿照arrayList写了一个简化版的线性表,主要为了用来研究arrayList在实现什么操作的情况下比较节省性能,楼主文采很差,直接上代码. import java.util.Arrays; pub ...
- java线性表学习笔记(一)
线性表是一种按顺序储存数据是的常用结构,大多数的线性表都支持以下的典型操作: 从线性表提取插入删除一个数据: 找出线性表中的某一个元素: 找出线性表中的元素: 确定线性表中是否包含某一个元素,确定线性 ...
- java——线性表接口实现
线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...
- java线性表学习笔记(二)
链表中的每一个元素都包含一个称为节点的结构,每向链表中增加一个元素,就会产生一个与之相关的节点,每个节点与它相邻的节点相连接(这是基础吧,不过在看c的时候没认真看,呼). 定义节点类如下(使用了泛型, ...
- 数据结构与算法分析java——线性表3 (LinkedList)
1. LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作.LinkedList 实现 Lis ...
- 数据结构与算法分析java——线性表2(ArrarList )
ArrayList ArrayList 是一个数组队列,相当于 动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, C ...
- 【数据结构】线性表&&顺序表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 预备知识 1.0 什么是线性表? 线性表(List)是零个或者多个数据元素的有限序列. 首先它是一个序列.里面的元素是有顺 ...
随机推荐
- POJ_1220_Nmber Sequence
上网查了一下进制转换的算法,发现一个性能比较好的:m进制转换成n进制,先用例如62进制ABC转换成10进制,就是用余位c(第一个数余位数值为0)乘以原基数from,加上A表示的数值,然后得到一个数,对 ...
- 【Android开发经验】ViewHolder到底用什么修饰?static?final?static final?
其实一上来我就贴一张图就ok了,因为这几种完全一样,不管用什么修饰,ViewHolder都会初始化当前界面可见item的数量+1次,和convertView的实例化次数是一样的,因此,我么不管使用什么 ...
- java 常量池
在jvm规范中,每个类型都有自己的常量池.常量池是某类型所用常量的一个有序集合,包括直接常量(基本类型,String)和对其他类型.字段.方法的符号引用.之所以是符号引用而不是像c语言那样,编译时直接 ...
- 【HDOJ】2149 Public Sale
看Discuss说是博弈论,没学到这个分类.不过仔细想了想,发现.如果m<=n,那么可能结果为m,m+1...n.否则,如果m%(n+1) == 0,那么无论如何都会输,因为无论先报价什么数,如 ...
- Linux 下报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must解决方案
一.报错环境:在Linux mint下,前几天还用得很好的的eclipse,今天开机不知为什么这样. Linux 下报错:A Java RunTime Environment (JRE) or Jav ...
- NOI2003 文本编辑器editor
1507: [NOI2003]Editor Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1908 Solved: 738[Submit][Statu ...
- C# 防止同一个账号多次登录(cache方法)
c#中防止同一账号重复登录的方法有不少,比如用数据库来记录用户登录情况.用Application来保存用户登录信息.用Cache来保存信息等. 本文为大家介绍如何利用缓存Cache方便地实现此功能. ...
- (转载)1248 - Every derived table must have its own alias
(转载)http://hi.baidu.com/lylegend13/item/a79f17eb51f5dff7e0a5d43b 1. select count(distinct CName) fro ...
- 计算几何(容斥原理,圆交):HDU 5120 Intersection
Matt is a big fan of logo design. Recently he falls in love with logo made up by rings. The followin ...
- Java基础—异常处理总结
异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地 ...