@xujun94
2016-07-03T00:06:42.000000Z
字数 6114
阅读 2440
List和Map的排序
在实际的开发当中,我们经常 在文件浏览的时候经常有多种浏览方式,按时间整箱排序,逆向排序,按大小正逆向排序 ,按 按价格正逆向排序,这些其实都是List和Map中对象的排序,本篇博客不打算从实现文件浏览界面了,因为这些你随便去网上找一下,源码很多,本篇博客打算从java 的实现入门
关于二分查找的,可以参考我的这篇博客二分查找的相关算法题
关于归并排序的的,可以参考我的这篇博客归并排序 递归版和非递归版的实现(java)
关于快速排序的,可以参考我的这篇博客 快速排序的相关算法题(java)
转载请注明原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/50535340
本文固定链接: https://www.zybuluo.com/xujun94/note/424545
1.说白了,实现第一种方法的即对象实现java.lang.Comparable接口可以说是一个内部比较器,以后我们如果要修改排序方式,必须要修改原来的类,这明显违背了java对拓展开饭 ,对修改关闭的原则
2. 实现第二种方法的,相对于第一种方法来说,它可以说是一个外部比较器,修改排序方法,不需要修改原来的代码,相对来说比较灵活
实现Comparable接口的
//Product.java
import java.util.Date;
public class Product implements Comparable {//类内比较
private String name;
private Date date;
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
//用于类内比较
@Override//覆写compareTo(Object o)方法
public int compareTo(Product o) {
return -this.date.compareTo(o.date);
}
}
List<Product > productList=new ArrayList<Product >();
playerList.add(new Product ())
.......
Collections.sort(productList);
2.实现第二种方法的,即Comparator接口的
public class Product{
private String name;
private Date date;
private int price;
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
//ProductComparator.java
import java.util.Date;
import java.util.Comparator;
public class ProductComparator implements Comparator<Product> {
// 对象的排序方式[升、降]
public static boolean sortASC = true;
// 对象的排序属性
public static boolean sortByName = false;
public static boolean sortByDate = false;
public static boolean sortByPrice = false;
@Override
public int compare(Product pro1, Product pro2) {
int result = 0;
if(sortASC){
if(sortByName){
String pro1name = pro1.getName();
String pro2name = pro2.getName();
result = pro1name.compareTo(pro2name);
}else if(sortByDate){
Date pro1Date = pro1.getDate();
Date pro2Date = pro2.getDate();
result = pro1Date.compareTo(pro2Date);
}else if(sortByPrice){
Integer pro1Price = pro1.getPrice();
Integer pro2Price = pro2.getPrice();
result = pro1Price.compareTo(pro2Price);
}
}else{
if(sortByName){
String pro1name = pro1.getName();
String pro2name = pro2.getName();
result = -pro1name.compareTo(pro2name);
}else if(sortByDate){
Date pro1Date = pro1.getDate();
Date pro2Date = pro2.getDate();
result = -pro1Date.compareTo(pro2Date);
}else if(sortByPrice){
Integer pro1Price = pro1.getPrice();
Integer pro2Price = pro2.getPrice();
result = -pro1Price.compareTo(pro2Price);
}
}
return result;
}
}
//测试代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
public class ProductSort {
public static void main(String[] args) throws ParseException {
Product pro1 = new Product();
pro1.setName("pro1");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-dd-MM",Locale.CHINA);
pro1.setDate(sdf.parse("2009-03-23"));
pro1.setPrice(89);
Product pro2 = new Product();
pro2.setName("proc2");
pro2.setDate(sdf.parse("2009-02-23"));
pro2.setPrice(45);
Product pro3 = new Product();
pro3.setName("proc3");
pro3.setDate(sdf.parse("2009-01-23"));
pro3.setPrice(83);
Product pro4 = new Product();
pro4.setName("proc4");
pro4.setDate(sdf.parse("2009-01-23"));
pro4.setPrice(800);
List<Product> productList = new ArrayList<Product>();
productList.add(pro1);
productList.add(pro3);
productList.add(pro2);
productList.add(pro4);
System.out.println("排序前————————————————————");
for(Product p: productList){
System.out.println(p.getName()+"----"+p.getPrice()+"----"+p.getDate());
}
ProductComparable sort = new ProductComparable();
ProductComparable.sortASC = false;//降序
ProductComparable.sortByPrice=true; //设置排序属性生效
Collections.sort(productList,sort);
System.out.println("排序后————————————————————");
for(Iterator<Product> iter = productList.iterator(); iter.hasNext();){
Product p = (Product)iter.next();
System.out.println(p.getName()+"----"+p.getPrice()+"---"+p.getDate());
}
}
}
因为 你用一个第三方的类,但他没实现Comparable接口,而你又不能改他代码;另外,类一旦写好后是不允许修改的,但可以扩展,所以只能用Comparator接口
Map是键值对,所以既可以按照键进行排序,也可以按照值进行排序。通常因为键不能同,但是值可以同,所以很多都是用值来进行排序。
### 原理解析
public class MapSort{
public static void main(String[] args){
Map<String, Player> map = new HashMap<String, Player>();
Player p1 = new Player("John", 1000);
Player p2 = new Player("Ben", 3000);
Player p3 = new Player("Jack", 2000);
map.put(p1);
map.put(p2);
map.put(p3);
//将Map里面的所以元素取出来先变成一个set,然后将这个set装到一个list里面
List<Map.Entry<String, Player>> list = new ArrayList<Map.Entry<String, Player>>(map.entrySet());
//定义一个comparator
Comparator<Map.Entry<String, Player>> comparator = new Comparator<Map.Entry<String, Player>>(){
@Override
public int compare(Entry<String, Player> p1, Entry<String, Player> p2){
//之所以使用减号,是想要按照分数从高到低来排列
return -(p1.getValue().score - p2.getValue().score);
}
};
Collections.sort(list, comparator);
for(Map.Entry<String, Player> entry:list){
System.out.println(entry.getValue().name + ":" + entry.getValue().score);
}
}
}
class Player{
String name;
int score;
public Player(String name, int score){
this.name == name;
this.score == score;
}
}
这样排序下来,最后就会输出如下内容
Ben:3000
Jack:2000
John:1000
关于二分查找的,可以参考我的这篇博客二分查找的相关算法题
关于归并排序的的,可以参考我的这篇博客归并排序 递归版和非递归版的实现(java)
关于快速排序的,可以参考我的这篇博客 快速排序的相关算法题(java)
转载请注明原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/50535340