一.Comparable和Comparator简介
在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较。但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要使用Comparable和Comparator。 Comparable和Comparator都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现排序,而Comparator是在集合外部实现的排序。所以如果想对结合排序,需要在集合外定义Comparator接口的方法或在集合内部实现Comparable接口的方法。
一个类实现了Comparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的结合就可以直接使用sort方法排序。
Comparator是策略模式,就是在不改变对象自身,而用一种策略对象来改变它的行为,将算法和数据分离,Comparator还可以在下面两种环境下使用:
1.类在设计时没有考虑到比较问题而没有实现Comparable接口,则可以通过Comparator来实现排序而不必修改原来的类代码。
2.类设计时实现了Comparable接口,但是后面的使用者却想用一种新的比较规则对类进行比较
二。用法示例:
Comparable排序:
首先定义实现Comparable接口的Item类
- package com.collection;
-
- import java.util.Objects;
-
-
-
-
-
-
- public class Item implements Comparable<Item>{
- private String description;
- private int partNumber;
-
- public Item(String aDescription, int aPartNumber)
- {
- description = aDescription;
- partNumber = aPartNumber;
- }
-
- public String getDescription()
- {
- return description;
- }
-
- public String toString()
- {
- return "[description="+description+",partNumber="+partNumber+"]";
- }
-
- public boolean equals(Object otherObject)
- {
- if(this == otherObject)
- return true;
- if(otherObject == null)
- return false;
- if(getClass()!=otherObject.getClass())
- return false;
- Item other = (Item)otherObject;
- return Objects.equals(description, other.description) &&partNumber == other.partNumber;
- }
-
- public int hashCode()
- {
- return Objects.hash(description,partNumber);
- }
-
-
- @Override
- public int compareTo(Item other)
- {
-
- return Integer.compare(partNumber, other.partNumber);
- }
-
-
- }
-
定义对Item进行排序的类,对集合进行排序是使用TreeSet或TreeMap,此处用TreeSet存放集合元素。
- package com.collection;
-
- import java.util.TreeSet;
-
- public class ListSortWithComparable
- {
-
- public static void main(String[] args)
- {
- TreeSet<Item> set = new TreeSet<>();
- set.add(new Item("zhuwei",26));
- set.add(new Item("yinyuchun",24));
- set.add(new Item("xiaobai",25));
- set.add(new Item("chun",24));
-
- for(Item it : set)
- {
- System.out.println(it.toString());
- }
-
- }
-
- }
-
Comparator排序实现示例:
首先定义需要排序的类People
- package com.collection;
-
- public class People
- {
- private String name;
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public int getAge()
- {
- return age;
- }
- public void setAge(int age)
- {
- this.age = age;
- }
- private int age;
-
- public People(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- public String toString()
- {
- return ("name:"+this.name+",age:"+this.age);
- }
- }
接着建立对People进行排序的类,利用Comparator进行排序有两种方法,第一种方法是把需要排序的People对象放在List集合中,然后调用Collection.sort(list,comparator)方法进行排序;第二中排序方法是直接把Comparator对象传递给TreeSet的构造器,并重载Comparator类的compara方法,指定排序规则,这种方法不需要让People类实现Comparator接口,且其代码较简洁。
Comparator
- package com.collection;
-
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.HashSet;
- import java.util.List;
- import java.util.SortedSet;
- import java.util.TreeSet;
-
- public class ListSortWithComparator
- {
- publicstatic void main(String[] args)
- {
-
-
-
-
-
-
- List<People>list = new ArrayList<>();
- list.add(newPeople("zhuwei",26));
- list.add(newPeople("yinyuchun",25));
- list.add(newPeople("xiaobai",26));
-
- MComparatorcomparator = new MComparator();
-
- Collections.sort(list,comparator);
-
- for(Peoplep:list)
- {
- System.out.println(p.toString());
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
- }