首页 > 其他 > 详细

Effective Java 12 Consider implementing Comparable

时间:2014-03-09 12:42:17      阅读:416      评论:0      收藏:0      [点我收藏+]

Sort array with sorted collection construction.

   

public class WordList {

public static void main(String[] args) {

Set<String> s = new TreeSet<String>();

// This will sort and filter the duplicated items in the string array automatically.

Collections.addAll(s, args);

System.out.println(s);

}

}

   

The interface

   

public interface Comparable<T> {

int compareTo(T t);

}

   

public final class CaseInsensitiveString

implements Comparable<CaseInsensitiveString> {

public int compareTo(CaseInsensitiveString cis) {

return String.CASE_INSENSITIVE_ORDER.compare(s, cis.s);

}

... // Remainder omitted

}

   

Implementation Key point

   

? The implementor must ensure sgn(x.compareTo(y)) == -sgn(y.compareTo(x))for all x and y. (This implies that x.compareTo(y)must throw an exception if and only if y.compareTo(x)throws an exception.)

? The implementor must also ensure that the relation is transitive: (x.compareTo(y) > 0 && y.compareTo(z) > 0)implies x.compareTo(z) > 0.

? Finally, the implementor must ensure that x.compareTo(y) == 0 implies that

sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for all z.

? It is strongly recommended, but not strictly required, that (x.compareTo(y)== 0) == (x.equals(y)). Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact. The recommended language is "Note: This class has a natural ordering

that is inconsistent with equals."

   

Note:

Compare integral primitive fields using the relational operators < and >. For floating-point fields, use Double.compare or Float.compare in place of the relational operators, which do not obey the general contract for compareTo when applied to floating point values. For array fields, apply these guidelines to each element.

   

// Normal implementation

public int compareTo(PhoneNumber pn) {

// Compare area codes

if (areaCode < pn.areaCode)

return -1;

if (areaCode > pn.areaCode)

return 1;

// Area codes are equal, compare prefixes

if (prefix < pn.prefix)

return -1;

if (prefix > pn.prefix)

return 1;

// Area codes and prefixes are equal, compare line numbers

if (lineNumber < pn.lineNumber)

return -1;

if (lineNumber > pn.lineNumber)

return 1;

return 0; // All fields are equal

}

   

/* The code below should be used when you‘re certain the fields in question are non-negative or, more generally, that the difference between the lowest and highest possible field values is less than or equal to Integer.MAX_VALUE(231-1).

*/

public int compareTo(PhoneNumber pn) {

// Compare area codes

int areaCodeDiff = areaCode - pn.areaCode;

if (areaCodeDiff != 0)

return areaCodeDiff;

// Area codes are equal, compare prefixes

int prefixDiff = prefix - pn.prefix;

if (prefixDiff != 0)

return prefixDiff;

// Area codes and prefixes are equal, compare line numbers

return lineNumber - pn.lineNumber;

}

   

   

   

   

Effective Java 12 Consider implementing Comparable,布布扣,bubuko.com

Effective Java 12 Consider implementing Comparable

原文:http://www.cnblogs.com/haokaibo/p/3586204.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!