Java集合2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:
作者:陈剑波
撰写时间:2019年06月09日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Comparable和Comparator
一、Comparable简介
Comparable是排序接口。如果一个类实现了Comparable接口,就意味着这个类支持排序。实现Comparable接口的的类的对象的列表或数组可以通过Collections.sort或Array.sort进行自动排序。
实现Comparable接口的对象可以用作有序映射中的键或有序集合中的集合,无需指 定比较器。
Comparable接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小 于、等于或大于指定对象,则分别返回负整数、零或正整数。
示例代码:
/** |
* @author KO.ZERO |
*实现接口Comparable<T> |
*Comparable是一个内比较器,实现了Comparable接口的类有一个特点, |
*就是这些类是可以和自己比较,至于具体和另一个实现了Comparable接口的类如何比较, |
*则依赖compareTo方法的实现,compareTo方法被称为自然比较方法。如果开发者add进入 |
*一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象 |
*必须实现Comparable接口。 |
*/ |
public class UniversityGradeComparable implements Comparable<UniversityGradeComparable> { |
private int ClassAndGrade;//班级 |
private String StudentName;//学生姓名 |
|
public UniversityGradeComparable() { |
|
} |
public UniversityGradeComparable(int classAndGrade, String studentName) { |
ClassAndGrade = classAndGrade; |
StudentName = studentName; |
} |
|
public int getClassAndGrade() { |
return ClassAndGrade; |
} |
public void setClassAndGrade(int classAndGrade) { |
ClassAndGrade = classAndGrade; |
} |
public String getStudentName() { |
return StudentName; |
} |
public void setStudentName(String studentName) { |
StudentName = studentName; |
} |
/** |
* @param o |
* @return |
* 实现compareTo方法 |
* campareTo(UniversityGradeComparable o); |
*返回值: int 返回 0(两者相等),负数(对象小于参数),正数 (对象大于参数) |
*参数: o 为要比较的对象 |
*/ |
@Override |
public int compareTo(UniversityGradeComparable o) { |
// TODO Auto-generated method stub |
if (this.ClassAndGrade != o.ClassAndGrade) {//先根据班级排序,如果同班级则根据学生姓名排序。 |
return this.ClassAndGrade - o.ClassAndGrade; |
} else { |
return this.StudentName.compareTo(o.StudentName); |
} |
} |
} |
import java.util.ArrayList; |
import java.util.Arrays; |
import java.util.Collections; |
import java.util.Iterator; |
import java.util.List; |
|
public class ListUniversityGradeComparable { |
public static void main(String[] args) { |
UniversityGradeComparable[] un = new UniversityGradeComparable[] { |
new UniversityGradeComparable(1704, "asf"), |
new UniversityGradeComparable(1703, "dsf"), |
new UniversityGradeComparable(1703, "fr"), |
new UniversityGradeComparable(1702, "asdf"), |
new UniversityGradeComparable(1704, "jyt"), |
new UniversityGradeComparable(1701, "ny"), |
new UniversityGradeComparable(1703, "po"), |
new UniversityGradeComparable(1704, "ve"), |
new UniversityGradeComparable(1703, "xq") |
|
}; |
// Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。 |
Arrays.sort(un); |
// foreach循环遍历输出结果 |
for (UniversityGradeComparable universityGradeComparable : un) { |
System.out.print(universityGradeComparable.getClassAndGrade() + ":" |
+ universityGradeComparable.getStudentName() + "|"); |
} |
System.out.println("\n"+"-----------------"); |
|
List<UniversityGradeComparable> universityGradeComparables = new ArrayList<UniversityGradeComparable>(); |
|
universityGradeComparables.add(new UniversityGradeComparable(1701, |
"DSSSF")); |
universityGradeComparables.add(new UniversityGradeComparable(1701, |
"ASRGR")); |
universityGradeComparables.add(new UniversityGradeComparable(1704, |
"ASG")); |
universityGradeComparables |
.add(new UniversityGradeComparable(1702, "HT")); |
universityGradeComparables.add(new UniversityGradeComparable(1704, |
"THN")); |
universityGradeComparables |
.add(new UniversityGradeComparable(1703, "TH")); |
universityGradeComparables |
.add(new UniversityGradeComparable(1703, "RH")); |
universityGradeComparables.add(new UniversityGradeComparable(1702, |
"RVB")); |
universityGradeComparables.add(new UniversityGradeComparable(1704, |
"IOHG")); |
universityGradeComparables.add(new UniversityGradeComparable(1703, |
"MJIUY")); |
// Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。 |
Collections.sort(universityGradeComparables); |
// foreach循环 |
// for (UniversityGradeComparable universityGradeComparable : |
// universityGradeComparables) { |
// System.out.println(universityGradeComparable.getClassAndGrade() |
// + "\t" + universityGradeComparable.getStudentName()); |
// } |
// While循环使用迭代器遍历输出列表数据 |
// Iterator<UniversityGradeComparable> iterator = |
// universityGradeComparables |
// .iterator(); |
// while (iterator.hasNext()) { |
// UniversityGradeComparable universityGradeComparable = |
// (UniversityGradeComparable) iterator |
// .next(); |
// System.out.println(universityGradeComparable.getClassAndGrade() |
// + "\t" + universityGradeComparable.getStudentName()); |
// } |
// for循环使用迭代器遍历输出列表数据 |
for (Iterator<UniversityGradeComparable> iterator2 = universityGradeComparables |
.iterator(); iterator2.hasNext();) {// hasNext():判断是否有元素可以迭代,有则返回 |
// true。 |
// iterator():返回在此 collection 的元素上进行迭代的迭代器。 |
UniversityGradeComparable universityGradeComparable = iterator2 |
.next();// next():返回迭代的下一个元素。 |
System.out.print(universityGradeComparable.getClassAndGrade() |
+ ":" + universityGradeComparable.getStudentName() + "|"); |
} |
} |
} |
运行结果:
1701:ny|1702:asdf|1703:dsf|1703:fr|1703:po|1703:xq|1704:asf|1704:jyt|1704:ve| |
----------------- |
1701:ASRGR|1701:DSSSF|1702:HT|1702:RVB|1703:MJIUY|1703:RH|1703:TH|1704:ASG|1704:IOHG|1704:THN| |
二、Comparator简介
Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排 序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排 序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现 Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
注意:
- 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但 可以不实现 equals(Object obj) 函数。
- int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2 小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
示例代码:
import java.util.Comparator; |
|
/** |
* @author KO.ZERO |
*实现接口Comparator<T> |
*Comparator是一个外比较器,实现Comparator接口的方式有两种: |
*1、没有实现Comparable接口,但又想比较两个对象。 |
*2、实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。 |
*Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象 |
*是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2 小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。 |
*/ |
public class UniversityGradeComparator implements Comparator<UniversityGradeComparator> { |
private int ClassAndGrade;// 班级 |
private String StudentName;// 学生姓名 |
public UniversityGradeComparator() { |
|
} |
public UniversityGradeComparator(int classAndGrade, String studentName) { |
ClassAndGrade = classAndGrade; |
StudentName = studentName; |
} |
public int getClassAndGrade() { |
return ClassAndGrade; |
} |
public void setClassAndGrade(int classAndGrade) { |
ClassAndGrade = classAndGrade; |
} |
public String getStudentName() { |
return StudentName; |
} |
public void setStudentName(String studentName) { |
StudentName = studentName; |
} |
/** |
* @param o1 |
* @param o2 |
* @return |
* 实现compare方法 |
* int compare(UniversityGradeComparator o1,UniversityGradeComparator o2) |
* 返回值: int 返回 0(两者相等),负数(对象小于参数),正数 (对象大于参数) |
* 参数: o1 和o2为要比较的两个对象 |
*/ |
@Override |
public int compare(UniversityGradeComparator o1, |
UniversityGradeComparator o2) { |
//先根据班级排序,如果同班级则根据学生姓名排序。 |
if (o1.getClassAndGrade() != o2.getClassAndGrade()) { |
return o1.getClassAndGrade() |
- o2.getClassAndGrade(); |
} else { |
return o2.getStudentName().compareTo( |
o1.getStudentName()); |
} |
} |
} |
import java.util.ArrayList; |
import java.util.Arrays; |
import java.util.Collections; |
import java.util.Comparator; |
import java.util.Iterator; |
import java.util.List; |
|
public class ListUniversityGradeComparator { |
public static void main(String[] args) { |
UniversityGradeComparator[] un=new UniversityGradeComparator[]{ |
new UniversityGradeComparator(1704, "克鲁德"), |
new UniversityGradeComparator(1701, "弗利沙"), |
new UniversityGradeComparator(1704, "巴拉卡斯"), |
new UniversityGradeComparator(1703, "达尔"), |
new UniversityGradeComparator(1703, "布罗利"), |
new UniversityGradeComparator(1701, "卡卡罗特"), |
new UniversityGradeComparator(1704, "巴达克"), |
new UniversityGradeComparator(1704, "姬内"), |
new UniversityGradeComparator(1702, "拉迪兹") |
}; |
// Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。 |
Arrays.sort(un,new UniversityGradeComparator()); |
// foreach循环遍历输出结果 |
for (UniversityGradeComparator universityGradeComparator : un) { |
System.out.print(universityGradeComparator.getClassAndGrade() |
+ ":" + universityGradeComparator.getStudentName()+"|"); |
} |
System.out.println("\n"+"--------------"); |
|
List<UniversityGradeComparator> universityGradeComparators = new ArrayList<UniversityGradeComparator>(); |
|
universityGradeComparators.add(new UniversityGradeComparator(1701, |
"向日葵")); |
universityGradeComparators.add(new UniversityGradeComparator(1704, |
"沙罗妲")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1704, "巳月")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1702, "鹿台")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1701, "蝶蝶")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1703, "佐井")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1703, "鸣人")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1702, "佐助")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1704, "小樱")); |
universityGradeComparators |
.add(new UniversityGradeComparator(1703, "羽衣")); |
|
// Collections.sort (和Arrays.sort )可以自动对实现此接口的对象进行列表(和数组)排序。 |
Collections.sort(universityGradeComparators, |
/** |
* @author KO.ZERO |
* 创建Comparator比较器,在Comparator比较器中 |
*重写int compare(UniversityGradeComparator o1, UniversityGradeComparator o2) 如果遇到数字的比较, |
*直接在方法内返回两个对象的属性的差值,例如return o1.getClassAndGrade() - o2.getClassAndGrade(); |
*是升序,return o2.getClassAndGrade() - o1.getClassAndGrade(); 是降序;如果遇到字符形式的比较利用 |
*compareTo(T o) 方法进行比较,该方法比较从头开始每一个字符,当前者大于后 |
*者返回1,当前者小于后者返回-1。 |
*/ |
new Comparator<UniversityGradeComparator>() { |
|
@Override |
public int compare(UniversityGradeComparator o1, |
UniversityGradeComparator o2) { |
// TODO Auto-generated method stub |
if (o1.getClassAndGrade() != o2.getClassAndGrade()) { |
return o1.getClassAndGrade() |
- o2.getClassAndGrade(); |
} else { |
return o2.getStudentName().compareTo( |
o1.getStudentName()); |
} |
} |
}); |
Iterator<UniversityGradeComparator> iterator = universityGradeComparators.iterator(); |
// iterator():返回在此 collection 的元素上进行迭代的迭代器。 |
while (iterator.hasNext()) {//hasNext():如果仍有元素可以迭代,则返回 true。 |
UniversityGradeComparator universityGradeComparator = (UniversityGradeComparator) iterator |
.next();//next():返回迭代的下一个元素。 |
System.out.print(universityGradeComparator.getClassAndGrade() |
+ ":" + universityGradeComparator.getStudentName()+"|"); |
} |
} |
} |
运行结果:
1701:弗利沙|1701:卡卡罗特|1702:拉迪兹|1703:达尔|1703:布罗利|1704:巴达克|1704:巴拉卡斯|1704:姬内|1704:克鲁德| |
-------------- |
1701:蝶蝶|1701:向日葵|1702:鹿台|1702:佐助|1703:鸣人|1703:羽衣|1703:佐井|1704:沙罗妲|1704:巳月|1704:小樱| |