主要分析内容:

一、Collections工具类两种sort()方法

二、示例

一、Collections工具类两种sort()方法

格式一: public static <T extends Comparable<? super T>> void sort(List<T> list)

说明:该方法中的泛型<T>都是Comparable接口的子类,即只有是Comparable接口子类类型的数据,才能进行比较排序。如果其他类型的数据要进行比较排序,必须继承Comparable接口并

覆写equals()和compareTo()方法。其中如String类、Integer类都是Comparable接口子类,可以进行排序,而基本类型不能进行sort排序。比较项目在类内指定

格式二:public static <T> void sort(List<T> list, Comparator<? super T> c)

说明:该方法中指定比较方式Comparator<? super T> c,即c必须实现Comparator<? super T>接口,覆写compareTo()方法指定比较项目。比较项目在类外指定,比较灵活

二、示例

示例中获取字符串和数字的公用方法:

  /**
* 生成随机 不重复的字符串 : number 生成字符串个数
*/
public static List<String> generateString(int number) {
List<String> listString = new ArrayList<>(); // 用于存放返回值
List<Integer> length = null; // 字符串长度
StringBuffer sb = new StringBuffer(); // 中间变量
int control = 0; // 控制个数
String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h",
"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z" };
while (true) {
// 控制结束
if ( control==number ) {
break;
}
// 生成随机数,生成36位的2aaab761-4341-4968-aceb-3861ee3824b2 UUID类型数据
String uuid = UUID.randomUUID().toString().replace("-", "");
sb.setLength(0);
// 获得随机字符串长度,长度不为0
do {
length = getDiffNo(1, 11);
} while ( length.get(0)==0 );
// 拼凑字符串
for (int i=0; i<length.get(0); i++) {
String str = uuid.substring(i*3, (i*3+3));
//将str字符串转换为16进制,获得其值
int x = Integer.parseInt(str, 16);
//取余:x % 0x3E--0x3E = 3*16 + 14 = 62, 其中chars有62个字符
sb.append(chars[x % 0x3E]);
}
listString.add(sb.toString());
control++;
}
return listString;
} /**
* 生成随机不重复的数字 :n生成个数 max生成范围
*/
public static List<Integer> getDiffNo(int n, int max) {
// 生成 [0-n] 个不重复的随机数
// list 用来保存这些随机数
List<Integer> list = new ArrayList<>();
Random random = new Random();
Integer k;
for (int i=0; i<n; i++) {
do {
k = random.nextInt(max);
} while (list.contains(k));
list.add(k);
}
return list;
}

1、对Integer泛型的List进行排序

  /**
* 1.通过Collections.sort()方法,对Integer泛型的List进行排序;
* 创建一个Integer泛型的List,插入十个100以内的不重复随机整数, 调用Collections.sort()方法对其进行排序
* 2.排序规则:先数字后字母,数字0-9,字母A-Z a-z的顺序
*/
public void listIntegerSort() {
// 插入十个100以内的不重复随机整数
List<Integer> integerList = getDiffNo(10, 100);
System.out.println("-------------排序前--------------");
for (Integer integer : integerList) {
System.out.println("元素:" + integer);
}
Collections.sort(integerList);
System.out.println("----------------排序后-------------------");
for (Integer integer : integerList) {
System.out.println("元素:" + integer);
}
}

2、对String泛型的List进行排序

  /**
* 1.对String泛型的List进行排序; 创建String泛型的List,添加乱序的String元素,
* 调用sort方法,再次输出排序后的顺序
*/
public void listStringSort() {
List<String> stringList = new ArrayList<String>();
stringList.add("eipJlcx");
stringList.add("WvQRufC");
stringList.add("J");
stringList.add("HdaU2G");
stringList.add("M0WswHD3");
System.out.println("------------排序前-------------");
for (String string : stringList) {
System.out.println("元素:" + string);
}
Collections.sort(stringList);
System.out.println("--------------排序后---------------");
for (String string : stringList) {
System.out.println("元素:" + string);
}
}
  /**
* 对String泛型的List进行排序,要求随机生成10个的不重复字符串,字符串的长度在10以内
*/
public void listStringRandomSort() {
// 生成随机字符串
List<String> listString = generateString(10);
System.out.println("--------------排序前---------------");
for (String integer : listString) {
System.out.println("元素:" + integer);
}
// 排序
Collections.sort(listString);
System.out.println("----------------排序后------------------");
for (String integer : listString) {
System.out.println("元素:" + integer);
}
}

3、对其他类型泛型的List进行排序

  • Course类实现
/**
* 课程类
* @author Administrator
*
*/
public class Course {
public String id;
public String name;
public Course(String id, String name) {
this.id = id ;
this.name = name;
}
public Course() {
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Course))
return false;
Course other = (Course) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
  • Student类实现Comparable接口,类内设置比较项
import java.util.HashSet;
import java.util.Set; /**
* 学生类
* @author Administrator
*
*/
public class Student implements Comparable<Student> {
public String id;
public String name;
public Set<Course> courses; public Student(String id, String name) {
this.id = id;
this.name = name;
this.courses = new HashSet<Course>();
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Student))
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} @Override
public int compareTo(Student o) { // 设置ID为比较项
// TODO Auto-generated method stub
return this.id.compareTo(o.id);
}
}
  • 实现Comparator接口,类外设置比较项
import java.util.Comparator;
public class StudentComparator implements Comparator<Student> { @Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o1.name.compareTo(o2.name);
}
}
  • 比较Student类
/**
* 对其他类型泛型的List进行排序,以Student为例。
*/
public void listComparatorSort() {
List<Student> studentList = new ArrayList<Student>();
List<Integer> list = getDiffNo(4, 1000); studentList.add(new Student(list.get(0) + "", "Mike"));
studentList.add(new Student(list.get(1) + "", "Angela"));
studentList.add(new Student(list.get(2) + "", "Lucy"));
studentList.add(new Student(1000 + "", "Beyonce"));
System.out.println("--------------排序前---------------");
for (Student student : studentList) {
System.out.println("学生:" + student.id + ":" + student.name);
}
// 实现Comparator<T>接口,设置ID比较方式
Collections.sort(studentList);
System.out.println("----------------按照ID排序后------------------");
for (Student student : studentList) {
System.out.println("学生:" + student.id + ":" + student.name);
} // 实现Comparator<T>接口,设置特定比较方式,以name比较排序
Collections.sort(studentList, new StudentComparator());
System.out.println("----------------按照姓名排序后-----------------");
for (Student student : studentList) {
System.out.println("学生:" + student.id + ":" + student.name);
}
}

参考学习连接:

Comparable接口的实现和使用:http://www.cnblogs.com/gnuhpc/archive/2012/12/17/2822251.html

Collections.sort对List排序的两种方法:http://blog.csdn.net/wxx614817/article/details/50628197

JAVA Collections工具类sort()排序方法的更多相关文章

  1. 用斗地主的实例学会使用java Collections工具类

    目录 一.背景 二.概念 1.定义 2.方法 2.1.排序方法 2.2.查找/替换方法 三.斗地主实例 3.1.代码结构 3.2.常量定义 3.3.单只牌类 3.4.玩家类 3.5.主程序 四.深入理 ...

  2. java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合

    Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...

  3. java Collections工具类

    Collections 是专门对集合进行操作的类  比如排序sort 也可以使用自定义的比较器 sort文档中的定义 必须具有比较性,具有比较性必须是comparable 的子类 '<T ext ...

  4. Collections 工具类和 Arrays 工具类常见方法

    Collections Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void revers ...

  5. Collections 工具类常见方法

    Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void reverse(List list) ...

  6. TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

    TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...

  7. Java集合(1):Collections工具类中的static方法

    与Arrays一样,Collections类中也有一些实用的static方法. (1) 排序操作 reverse(List list):反转指定List集合中元素的顺序 shuffle(List li ...

  8. Java:集合,Collections工具类用法

    Collections工具类提供了大量针对Collection/Map的操作,总体可分为四类,都为静态(static)方法: 1. 排序操作(主要针对List接口相关) reverse(List li ...

  9. Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)

    集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...

随机推荐

  1. 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理

    系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...

  2. java中构造方法的特殊性

    构造方法名与类名相同 构造方法没有返回值,也不能写void 构造方法的主要作用是完成对对象的初始化工作 构造方法一般不由编程人员显示调用,而是由new来调用 在创建一个类的对象的同时,系统会自动调用该 ...

  3. C语言 · 送分啦

    问题描述 这题想得分吗?想,请输出"yes":不想,请输出"no". 输出格式 输出包括一行,为"yes"或"no". ...

  4. 【原】Python 用例:二进制写入和读取文件内容

    import pickle as p shoplistfile='shoplist.data' shoplist=['apple','carrot'] # because the dump opera ...

  5. Android开发-之SQLite数据库

    之前我们讲了如何将数据存储在文件中,那么除了这种方式呢,就是我们常见的大家都知道的将数据存储在数据库当中了. 将数据存储在数据库中的优势: 1)存储在数据库中的数据更加方便操作,比如增.删.改.查等 ...

  6. Hello Blog

    转眼之间,工作已经快五年了. 五年走的时候不觉得,当真正过来了,一回头,才真正体会到什么叫时间匆匆. 做了五年的技术,算是多有波折.想一想,做技术真的挺需要耐得住寂寞的,毕竟花花世界,压力太大,诱惑太 ...

  7. Android 之 ProgressDialog用法介绍

    布局文件测试: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi ...

  8. 小身材大用途,用PrimusUI驾驭你的页面

    “PrimusUI”是自己在借鉴了如今网上很多开源的UI库,再经过自己整理加工的一个简单代码集合. 每个功能块的CSS代码都很少,力求简单易懂,低门槛,代码可根据自己实际情况轻易修改,改到符合自己场景 ...

  9. Hammer.js分析(四)——recognizer.js

    不同识别器会使用不同逻辑,根据从相关Input类获取到的事件对象和事件,实现自定义的触屏事件,例如tap.pinch等. 一.继承关系 Recognizer与前面的Input一样,也相当于是个抽象类. ...

  10. WebGIS中矢量切图的初步研究

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在GIS领域,金字塔技术一直是一个基础性技术,WMTS规范专 ...