java中如果2个对象需要进行比较(对于某个成员对象的比较),可以有2种方式,实现接口Comparable和Comparator。它们之间还有区别。
源码如下:
public interface Comparable<T> { public int compareTo(T o); }这个接口主要是实现自身对象与其他对象的比较。只需要实现这个接口,就可以直接采取CompareTo进行对象的比较,内部实现具体字段的比较即可。 String就实现了此接口,源码如下:
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }源码如下:
public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }这个比较可以实现2个对象之间的比较,想对于Comparable来说,就很独立了。所比较的类无需实现接口,由其他类实现接口,调用方法,将比较对象传递进去进行比较即可。同时还能灵活控制比较类型。如下:
public class Compare implements Comparator<User> { private String type; public Compare(String type){ this.type = type; } public int compare(User user1, User user2) { if (type.equals("id")){ //TODO }else if (type.equals("name")){ //TODO } return 0; } }根据传递的不同参数,决定不同对象之间比较哪些属性即可。
1.自定义详细的排序,采取Comparator即可。可调用Collections.sort()、Arrays.sort()方法。 2.TreeMap构造参数可传递Comparator。 其余随意。
注: 当我们需要对中文等排序时,可结合刚刚的排序方法。如下所示,可比较出中文的先后顺序。
String title1 = "北京; String title2 = "上海"; int title = Collator.getInstance(Locale.CHINA).compare(title1, title2);详细方法可参考其他文章: http://www.hollischuang.com/archives/1292