Comparator and Comparable

java.util.concurrent.PriorityBlockingQueue.comparator()
java.util.PriorityQueue.comparator()
java.util.SortedMap.comparator()
java.util.SortedSet.comparator()
java.util.TreeMap.comparator()
java.util.TreeSet.comparator()

在TreeSet和TreeMap中添加的自定义对象必须实现Comparable接口
(自定义对象如果要加入到以上这些集合必须实现Comparable接口
或者在在构造函数中指定Comparator接口
)

排序:互换性,传递性,互换抛异常和equal保持一致(非必要)

 

 

Comparable<User-defined Object T>:
 public int compareTo(T o);


Comparator<User-defined Object T>:
 public int compare(T o1, T o2)
 public int cequal(T o1,T o2)

 


TreeSet(Collection<? extends E> c)

 

================

Comparator和Comparable的区别

  先看一下使用Comparator对User集合实现排序的方式:一个类实现了Camparable接口则表明这个类的对象之间是可

以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。

Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

 

1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等

 


在TreeSet和TreeMap中添加的自定义对象必须实现Comparable接口,否则调用任何方法都回出错
或者new的时候加入Comparator实例


对象o必须实现Comparable接口或者加入Comparator实例
Collections.sort( c<o>);

Arrays.sort( o[] );


===================
Arrays:
asList
binarySearch
equals
fill
hashCode
sort
toString


deepEquals(Object[] a1, Object[] a2)
deepHashCode(Object[] a)
deepToString(Object[] a)

 

 

 

package samples;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.TreeSet;

public class TestCompare {
	public static void main(String[] args) {
		/*
		 * Constructs a new set containing the elements in the specified
		 * collection, sorted according to the elements' natural order
		 * 如果User没有实现Comparable接口,会报错
		 */
		TreeSet<User> ts1 = new TreeSet<User>(User.initUsers());
		System.out.println(ts1.size());

		TreeSet<User> ts2 = new TreeSet<User>(new AgeComparator());
		ts2.add(new User("张三", 25));
		ts2.add(new User("李四", 26));
		ts2.add(new User("王五", 21));
		System.out.println(ts2.size());
		populateSet(ts2);


		/*中文排序JAVA有好的结局方案么?
		 * http://www.iteye.com/topic/81640
		 */
		
		TreeSet<User> ts3 = new TreeSet<User>(new NameComparator());
		ts3.add(new User("张三", 25));
		ts3.add(new User("李四", 26));
		ts3.add(new User("王五", 21));
		System.out.println(ts3.size());
		populateSet(ts3);

		TreeSet<User> ts4 = new TreeSet<User>(new NameComparator2());
		ts4.add(new User("张三", 25));
		ts4.add(new User("李四", 26));
		ts4.add(new User("王五", 21));
		System.out.println(ts4.size());
		populateSet(ts4);
		
		/*
		 * End 中文排序
		 */
		List<User> l = User.initUsers();
		/*
		 * 参见Array List转换,直接写会报错的
		 * User[] users = (User[])(l.toArray());
		 * 
		 * */
		User[] users = new User[l.size()];
		users = (User[])(l.toArray(users));
		
		l.get(0).setAge(100);
		
		/*
		 * 如果User对象没有实现comparable接口,这个方法不能过编译
		 * Collections.sort(l);
		 */
		Collections.sort(l, new AgeComparator());
		populateList(l);
		
		/*
		 * User必须实现Comparable接口,调用这个方法
		 */
		Arrays.sort(users);
		
		for(User u :users){
			System.out.print(u.getName()+" ");
			System.out.print(u.getAge()+" ");
		}
		System.out.println();
		
		
	}

	public static void populateSet(Set<User> s) {
		Iterator<User> iter = s.iterator();
		while (iter.hasNext()) {
			User u = iter.next();
			System.out.print(u.getName() + "  ");
			System.out.print(u.getAge() + "  ");
		}
		System.out.println();
	}
	
	public static void populateList(List<User> l) {
		Iterator<User> iter = l.iterator();
		while (iter.hasNext()) {
			User u = iter.next();
			System.out.print(u.getName() + "  ");
			System.out.print(u.getAge() + "  ");
		}
		System.out.println();
	}
}

/*
 * Comparable<User>
 * 
 * 如果不实现这个接口的话,调用任何TreeSet/TreeMap的方法都会报错 String等等已经实现了这个接口
 */
class User implements Comparable<User> {
	private String name;

	private int age;
	
	//private Date birthday = null ;

	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}

	/*
	 * return List<User>
	 */
	public static List<User> initUsers() {
		List<User> l = new ArrayList<User>();
		l.add(new User("张三", 25));
		l.add(new User("李四", 26));
		l.add(new User("王五", 21));

		return l;
	}

	/*
	 * 
	 * 导致的结果就是所有的对象都一致 TreeSet,TreeMap来说,根据compareTo来判定是否是同一个对象 或者 Map的key
	 * ts.size();永远是1,不管放入多少对象
	 */
	public int compareTo(User u) {
		return 0;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

}

class AgeComparator implements Comparator<User> {
	public int compare(User u1, User u2) {
		return u1.getAge() - u2.getAge();
	}
}

class NameComparator implements Comparator<User> {
	/*
	 * 
	 * 中文排序错误
	 */
	public int compare(User u1, User u2) {
		/*
		 * String already implemented Comparable Interface
		 */
		return u1.getName().compareTo(u2.getName());
	}
}

/*
 * The Collator class performs locale-sensitive String comparison. You use this
 * class to build searching and sorting routines for natural language text
 */
class NameComparator2 implements Comparator<User> {
	public int compare(User u1, User u2) {

		Collator myCollator = Collator.getInstance(Locale.CHINA);

		return myCollator.compare(u1.getName(), u2.getName());
	}
}

 

你可能感兴趣的:(java,算法)