文档章节

java如何对ArrayList中对象按照该对象某属性排序

文文1
 文文1
发布于 2016/06/19 19:05
字数 1661
阅读 737
收藏 2
点赞 0
评论 0

有几个方法可以实现:让 Student 实现Comparable接口,或是实例化一个比较器,现在用 Comparator 比较器实例来做一个:

ComparableTest.Java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


public class ComparableTest {
 public static void main(String[] args) {
    Comparator<Student> comparator = new Comparator<Student>(){
     public int compare(Student s1, Student s2) {
      //先排年龄
      if(s1.age!=s2.age){
       return s2.age-s1.age;
      }
      else{
       //年龄相同则按姓名排序
       if(!s1.name.equals(s2.name)){
        return s2.name.compareTo(s1.name);
       }
       else{
        //姓名也相同则按学号排序
        return s2.id-s1.id;
       }
      }
     }
    };
    Student stu1 = new Student (1,"zhangsan","male",28,"cs");
    Student stu2 = new Student (2,"lisi","female",19,"cs");
    Student stu3 = new Student (3,"wangwu","male",22,"cs");
    Student stu4 = new Student (4,"zhaoliu","female",17,"cs");
    Student stu5 = new Student (5,"jiaoming","male",22,"cs");

    ArrayList<Student> List = new ArrayList<Student>();
    List.add(stu1);
    List.add(stu2);
    List.add(stu3);
    List.add(stu4);
    List.add(stu5); 
    //这里就会自动根据规则进行排序
    Collections.sort(List,comparator);
    display(List);
   }
   
   static void display(ArrayList<Student> lst){
    for(Student s:lst)
     System.out.println(s);
   }
  }

  class Student{
   int age;
   int id;
   String gender;
   String name;
   String cs;
   Student(int id,String name,String gender,int age,String cs){
    this.age=age;
    this.name=name;
    this.gender=gender;
    this.id=id;
    this.cs=cs;
   }
   public String toString(){
    return id+"  "+name+"  "+gender+"  "+age+"  "+cs;
   }
  }

2.添加 Comparable 接口,重写 compareTo 方法。然后你可以用 TreeSet 结构进行排序。它会自动排序。

实例:

Bean:

package chc;
public class StuVo implements Comparable<StuVo>{
  private String id;
  private String name;
  private Integer age;
  public StuVo(String id, String name, Integer age) {
    this.id=id;
    this.name=name;
    this.age=age;
  }
  public int compareTo(StuVo stu) {
    return this.name.compareTo(stu.getName());
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
}

Demo:

package chc;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class ArrayListSortDemo {
  public static void main(String[] args) {
    List<StuVo> stuList=new ArrayList<StuVo>();
    StuVo stu=new StuVo("1","h小明",11);
    stuList.add(stu);
    
    stu=new StuVo("2","d阿熊",15);
    stuList.add(stu);
    
    stu=new StuVo("3","a张三",10);
    stuList.add(stu);
    
    stu=new StuVo("4","b李四",15);
    stuList.add(stu);
  
    Collections.sort(stuList);
    
    Iterator<StuVo> it =stuList.iterator();
    while(it.hasNext()){
      System.out.println(it.next().getName());
    }
  }
}

项目中的代码:

    对材料代号displayCode排序,该值是个数字字符串,很长,可能存在小数点,所以使用bigdecimal来判断:

​
            index = 1;
            for(String key:endMap.keySet()){
				pBudget0805 = endMap.get(key);
				pBudget0805.setIndex(index+"");
				data.add(pBudget0805);
				index++;
			};
		    Comparator<ProjectBudget0805> comparator = new Comparator<ProjectBudget0805>(){
			     public int compare(ProjectBudget0805 p1, ProjectBudget0805 p2) {
			        return new BigDecimal(p2.getDisplayCode()).compareTo(new BigDecimal(p1.getDisplayCode()));
			     }
		    };
			Collections.sort(data,comparator);
​​
index = 1;
			for(String key:endMap.keySet()){
				pBudget0805 = endMap.get(key);
				pBudget0805.setIndex(index+"");
				data.add(pBudget0805);
				index++;
			};
		    Comparator<ProjectBudget0805> comparator = new Comparator<ProjectBudget0805>(){
			     public int compare(ProjectBudget0805 p1, ProjectBudget0805 p2) {
			        return new BigDecimal(p2.getDisplayCode()).compareTo(new BigDecimal(p1.getDisplayCode()));
			     }
		    };
			Collections.sort(data,comparator);
            //循环排序后的data,设置记录正确的index,再放入到一个新的data1中
            index = 1;
            for(ProjectBudget0805 p:data){
				p.setIndex(index+"");
				data1.add(pBudget0805);
				index++;
			};
           //data1就是我们想要的结果
​

通过这个可以发现list集合中是按照displayCode的升序来排列的.

但是这么做有一个确定,要循环两次,才能得出记录正确的index索引号,改良后的写法:

            index = 1;
//			for(String key:endMap.keySet()){
//				pBudget0805 = endMap.get(key);
//				pBudget0805.setIndex(index+"");
//				data.add(pBudget0805);
//				index++;
//			};
			List<Entry<String, ProjectBudget0805>> endList = new ArrayList<>(endMap.entrySet());
		    Comparator<Map.Entry<String, ProjectBudget0805>> comparator = new Comparator<Map.Entry<String, ProjectBudget0805>>(){
			     public int compare(Map.Entry<String, ProjectBudget0805> o1,Map.Entry<String, ProjectBudget0805> o2) {
			    	String p1 = o1.getValue().getDisplayCode();
			    	String p2 = o2.getValue().getDisplayCode();
			        return new BigDecimal(p2).compareTo(new BigDecimal(p1));
			     }
		    };
			Collections.sort(endList,comparator);
            //这里是先排序,然后设置正确的索引号,不需要创建新的data1对象来放置data中的内容
			for(Entry<String, ProjectBudget0805> entity:endList){
				pBudget0805 = entity.getValue();
				pBudget0805.setIndex(index+"");
				data.add(pBudget0805);
				index++;
			}

附上一篇关于Map的文章:

java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中不存在两个Key相同的元素,而value不存在这个限制。换句话说,在同一个Map中Key是唯一的,而value不唯一。Map是一个接口,我们不能直接声明一个Map类型的对象,在实际开发中,比较常用的Map性数据结构是HashMap和TreeMap,它们都是Map的直接子类。如果考虑到存取效率的话,建议使用HashMap数据结构,而如果需要考虑到Key的顺序,建议使用TreeMap,但是TreeMap在删除、添加过程中需要排序,性能比较差。

1.以Key进行排序

//我们可以声明一个TreeMap对象
Map<Integer, Person> map = new TreeMap<Integer, Person>();
//然后往map中添加元素,可以通过输出结果,可以发现map里面的元素都是排好序的

//遍历集合
for (Iterator<Integer> it = map.keySet().iterator(); it.hasNext();) {
    Person person = map.get(it.next());
    System.out.println(person.getId_card() + " " + person.getName());
}
//我们也可以声明一个HashMap对象,然后把HashMap对象赋值给TreeMap,如下:
Map<Integer, Person> map = new HashMap<Integer, Person>();
TreeMap treemap = new TreeMap(map);

2.以Value进行排序:

​
//先声明一个HashMap对象:
Map<String, Integer> map = new HashMap<String, Integer>();
//然后我们可以将Map集合转换成List集合中,而List使用ArrayList来实现如下:

List<Entry<String,Integer>> list =
    new ArrayList<Entry<String,Integer>>(map.entrySet());
//最后通过Collections.sort(List l, Comparator c)方法来进行排序,代码如下:

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    public int compare(Map.Entry<String, Integer> o1,
            Map.Entry<String, Integer> o2) {
        return (o2.getValue() - o1.getValue());
    }
});
​

上述代码是讲map中的value按照逆序排序,如果需要按照升序进行排序的话,只需要修改o2.getValue() - o1.getValue()为o1.getValue() - o2.getValue()即可

在排序规则中也可以加上另外的条件,例如:

Comparator<ProjectBudget0708_1> comparator = new Comparator<ProjectBudget0708_1>(){
		     public int compare(ProjectBudget0708_1 p1, ProjectBudget0708_1 p2) {
		    	 BigDecimal index1 = p1.getIndex2();
		    	 BigDecimal index2 = p2.getIndex2();
		    	 //如果被比较的两个数都包含小数点(即定额下挂靠的消耗的排序)
		    	 if(index1.toString().contains(".") && index2.toString().contains(".")){
		    		 String str1 = index1.toString();
		    		 String str2 = index2.toString();
		    		 String subStr1 = str1.substring(0, str1.indexOf("."));
		    		 String subStr2 = str2.substring(0, str2.indexOf("."));
		    		 //如果subStr1等于subStr2,表示两个消耗在同一个定额下,那么根据两个消耗的displayCode排序;其余的情况都是通过index2进行排序
		    		 if(subStr1.equals(subStr2)){
		    			 return new BigDecimal(p1.getListCode()).compareTo(new BigDecimal(p2.getListCode()));
		    		 }
		    	 };
		        return p1.getIndex2().compareTo(p2.getIndex2());
		     }
	    };
Collections.sort(data,comparator);

另外再说个例子:

比如有两个list每个list中的元素是同种类型,都为object[]数组,现在要把这两个list组合到一起,按照object中的某个属性按照顺序显示,

方法1.可以循环每个list,然后添加两个list中的元素,在添加的时候注意排除掉已经添加过的元素即可,最后用compare比较器定义比较规则,最后按照规则进行排序.

方法2.利用treeSet,treeSet是有序的,不能用hashSet

TreeSet<Object[]> set = new TreeSet<Object[]>(new Comparator<Object[]>(){
        public int compare(Object[] p1, Object[] p2) {
            int num = ((BigInteger)p1[16]).compareTo((BigInteger)p2[16]);
            return num;
        }
});

String secUid = "";
if(list != null){
	for(Object[] object:list){
		secUid = (String)object[0];
		set.add(object);
	}
}
if(list1 != null){
	for(Object[] object:list1){
		secUid = (String)object[0];
		set.add(object);
	}
}

在treeSet添加元素的时候,就已经按照里面object[]数组中的某个元素的值排好序了

本文转载自:

共有 人打赏支持
文文1
粉丝 19
博文 339
码字总数 114952
作品 0
长沙
程序员
115个Java面试题和答案——终极列表(上)

本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力。下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Jav...

LCZ777
2014/04/23
0
0
【转】115个Java面试题和答案——终极列表

本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力。下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Jav...

一只死笨死笨的猪
2014/09/30
0
0
java一些基础问题(听说是java应聘者老被问的问题!)

1、作用域public,private,protected,以及不写时的区别 答:区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × priv...

独钓渔
2013/07/31
0
0
java8 (一):为神马要学习java8?

java8新特性 1.1 新特性介绍: 简而言之,java8的新特性就是:Lamdba函数(匿名函数),流,默认方法。 Java8 的灵活使用,会使得代码可读性更好(前提是你的同事也使用,别人不会,你强行使...

AHUSKY
07/14
0
0
java集合入门和深入学习,看这篇就差不多了

集合框架: Java中的集合框架大类可分为Collection和Map;两者的区别: Collection是单列集合;Map是双列集合 Collection中只有Set系列要求元素唯一;Map中键需要唯一,值可以重复 Collecti...

sihailoveyan
05/04
0
0
Java编程学习:集合框架详解

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/30
0
0
JAXB Annotation初步使用

JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式。JAXB提供两种主要特性:将一个Java对象序列化为XML,以及反向操作,将XML解析成Java对象。换...

秋风醉了
2014/07/02
0
0
图解 Java IO : 一、File源码

Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket 记得Java源码是集合开始看的,写了一系列集合相关的文章,受到不错的评价。感...

泥沙砖瓦浆木匠
2015/07/15
0
4
Java 5 、6、 7中新特性

JDK5新特性(与1.4相比)【转】 1 循环 for (type variable : array){ body} for (type variable : arrayList){body} 而1.4必须是: for (int i = 0; i < array.length; i++){ type variabl......

thinkyoung
2014/10/14
0
0
40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使 用,Java1.2提出了囊括所有集...

赵小宾
2015/05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部