List元素排序简例

前言:这种处理方式,在程序中偶尔会用的到,栗子很简单,关键是加强一下记忆,以及以备后用

1:实现Comparable接口的方式

1-1:没有使用泛型,重写compareTo()方法时需要判断类型及转换

public class Region implements Comparable{
    /**
     * 区域ID
     */
    private Integer id;
    /**
     * 区域名称
     */
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 方便打印对象信息,重写toString()方法
     * @return
     */
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("{\"Region\":{");
        sb.append("\"id\":\"").append(id).append("\"").append(",");
        sb.append("\"name\":\"").append(name).append("\"");
        sb.append("}}");
        return sb.toString();
    }

    /**
     * 重写排序的方法,本例的核心方法
     * @param o
     * @return
     */
    @Override
    public int compareTo(Object o) {
        if (o instanceof Region) {
            Region r = (Region) o;
            if (this.getId() > r.getId()) {
                return 1;
            } else {
                return -1;
            }
        } else {
            throw new ClassCastException("Can‘t compare");
        }
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestOrderMain {
    public static void main(String args[]){
        List<Region> list = new ArrayList<Region>();
        //构造一个无序的集合
        Region region1 = new Region();
        region1.setId(1);
        region1.setName("华东");
        list.add(region1);
        Region region2 = new Region();
        region2.setId(3);
        region2.setName("华北");
        list.add(region2);
        Region region3 = new Region();
        region3.setId(2);
        region3.setName("华南");
        list.add(region3);
        //排序
        Collections.sort(list);
        //出入排序后的集合
        for(Region region : list){
            System.out.println(region.toString());
        }
    }
}

1-2:使用了泛型,重写compareTo()方法时无需判断类型及转换,相对简单一些

public class Region implements Comparable<Region>{
    /**
     * 区域ID
     */
    private Integer id;
    /**
     * 区域名称
     */
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 方便打印对象信息,重写toString()方法
     * @return
     */
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("{\"Region\":{");
        sb.append("\"id\":\"").append(id).append("\"").append(",");
        sb.append("\"name\":\"").append(name).append("\"");
        sb.append("}}");
        return sb.toString();
    }

    /**
     *重写排序的方法,本例的核心方法
     * @param o
     * @return
     */
    @Override
    public int compareTo(Region o) {
        return this.getId().compareTo(o.getId());
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestOrderMain {
    public static void main(String args[]){
        List<Region> list = new ArrayList<Region>();
        //构造一个无序的集合
        Region region1 = new Region();
        region1.setId(1);
        region1.setName("华东");
        list.add(region1);
        Region region2 = new Region();
        region2.setId(3);
        region2.setName("华北");
        list.add(region2);
        Region region3 = new Region();
        region3.setId(2);
        region3.setName("华南");
        list.add(region3);
        //排序
        Collections.sort(list);
        //出入排序后的集合
        for(Region region : list){
            System.out.println(region.toString());
        }
    }
}

2:实现Comparator接口

2-1:这种方式比较好,在排序的时候直接使用Comparator的匿名对象,排序的方式也一目了然,并且和集合中的元素彻底解耦

public class Region{
    /**
     * 区域ID
     */
    private Integer id;
    /**
     * 区域名称
     */
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 方便打印对象信息,重写toString()方法
     * @return
     */
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("{\"Region\":{");
        sb.append("\"id\":\"").append(id).append("\"").append(",");
        sb.append("\"name\":\"").append(name).append("\"");
        sb.append("}}");
        return sb.toString();
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class TestOrderMain {
    public static void main(String args[]){
        List<Region> list = new ArrayList<Region>();
        //构造一个无序的集合
        Region region1 = new Region();
        region1.setId(1);
        region1.setName("华东");
        list.add(region1);
        Region region2 = new Region();
        region2.setId(3);
        region2.setName("华北");
        list.add(region2);
        Region region3 = new Region();
        region3.setId(2);
        region3.setName("华南");
        list.add(region3);
        //排序
        Collections.sort(list,new Comparator<Region>(){
            public int compare(Region o1, Region o2) {
                return o1.getId().compareTo(o2.getId());
            }
        });
        //出入排序后的集合
        for(Region region : list){
            System.out.println(region.toString());
        }
    }
}

2-2:实现Comparator接口,排序的时候直接传入对应的排序元素的匿名对象,估计也能使用泛型的形式,这个自己可以实验一下

import java.util.Comparator;

public class Region implements Comparator{
    /**
     * 区域ID
     */
    private Integer id;
    /**
     * 区域名称
     */
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 方便打印对象信息,重写toString()方法
     * @return
     */
    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("{\"Region\":{");
        sb.append("\"id\":\"").append(id).append("\"").append(",");
        sb.append("\"name\":\"").append(name).append("\"");
        sb.append("}}");
        return sb.toString();
    }

    /**
     * 重写排序的方法,本例的核心方法
     * @param o1
     * @param o2
     * @return
     */
    @Override
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Region && o2 instanceof Region) {
            Region r1 = (Region) o1;
            Region r2 = (Region) o2;
            if (r1.getId() > r2.getId()) {
                return 1;
            } else {
                return -1;
            }
        } else {
            throw new ClassCastException("Can‘t compare");
        }
    }
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestOrderMain {
    public static void main(String args[]){
        List<Region> list = new ArrayList<Region>();
        //构造一个无序的集合
        Region region1 = new Region();
        region1.setId(1);
        region1.setName("华东");
        list.add(region1);
        Region region2 = new Region();
        region2.setId(3);
        region2.setName("华北");
        list.add(region2);
        Region region3 = new Region();
        region3.setId(2);
        region3.setName("华南");
        list.add(region3);
        //排序
        Collections.sort(list,new Region());
        //出入排序后的集合
        for(Region region : list){
            System.out.println(region.toString());
        }
    }
}
时间: 2024-12-25 10:30:52

List元素排序简例的相关文章

Ansible 入门:安装 简例 playbook应用

Mysql 内:select unix_timestamp('2016-10-20')  <---> select from_unixtime(147662104) 转时间戳:date +%s   <--->  date -d @1476762104              ---- 小 Q -----------------------------------------------------------------------------------------------

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

oc-数组内元素排序

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //数组内元素排序 NSArray *arr=@[@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT",@"SUN"]; NSArray

数组内元素排序及数组排序

#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n",[[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSArray *[email protected][@&q

require.js【模块化编程】- 模块加载简例

今天去学习了一下javascript的模块化编程,写了个简单的例子. ———————————————— 这是我的第一篇技术性的小博文,希望和大家相互交流  ———————————————— 这个列子我打算分两个部分罗列: 1.文件地图 2.源代码 demo.html: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

我的测试用例设计-02用例组成元素(用例模板)

可以这么说,每一家公司对于测试用例的设计规范.风格和用例的组成元素(填写的字段)都一样,但都大同小异,不同只是来源于公司对于某些实际需求来带来的差异. 一般基本的测试用例都具有以下基础的组成元素:用例编号.用例名称.用例优先级.用例步骤.前提条件.预期结果.用例设计者.创建时间. 接下来说说我结合我公司的实际应用,设计出来的用例模板(使用QC9.0工具): 简单说一下某些字段用途: 1.用例版本:用于测试用例的版本管理,也可以追溯用例来源于哪个需求版本. 2.用例状态:有效用例则为当前该功能可用

Python对列表中字典元素排序

问题起源 json对象a,b a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}' b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}' 特点:a,b对应的Python的对象中键对应的键值——列表中包含着相同的字典元素,但是唯一不同的是顺序不同.如果忽略顺序,如何判断两

Java 远程调用之Hessian简例

1. [代码]1.服务接口(Hello.java) package server; public interface Hello { String hello(String name);}2. [代码]2.接口实现(HelloImpl.java) package server; public class HelloImpl implements Hello{ public String hello(String name) {    return "hello,"+name+"

从单链表中删除最大的元素,单链表元素排序

public class LinkList { public Node head; public LinkList() { head = new Node(); head.next = null; } //尾插法 public void createByTail(int[] arr, int n) { Node tail = head; for(int i=0; i<n; i++) { Node c = new Node(arr[i]); tail.next = c; tail = c; } t