有两种方法可以做到这一点。
在这种方法中,您使用自定义Comparator 对ArrayList 进行排序。
这是Comparator 代码。注意它是如何首先尝试对numberType 进行排序,然后是number:
public class PhoneNumberComparator implements Comparator<PhoneNumber> {
@Override
public int compareTo (PhoneNumber lhs, PhoneNumber rhs) {
int result = lhs.numberType.compareTo(rhs.numberType);
if (result == 0) {
result = lhs.number.compareTo(rhs.number);
}
return result;
}
}
然后你可以调用:
Comparator c = new PhoneNumberComparator();
arrayListToSort.sort (c)
现在,这本身不会完全起作用,因为numberType 的排序只是按字符串顺序排列的。最方便的排序方式是将numberType 设置为enumeration。这是代码:
public enum NumberType { MOBILE, HOME, OFFICE }
那么PhoneNumber必须被定义为numberType是NumberType:
public class PhoneNumber {
public String number ;
public NumberType numberType;
// .......
}
(顺便说一句,我鼓励你也将number 和numberType 变成private 变量,并按照JavaBeans standard 添加getter 方法。)
如果您打算经常进行这种排序,那么您应该让PhoneNumber 实现Comparable 接口,而不是编写Comparator:
public class PhoneNumber implements Comparable <PhoneNumber> {
public String number ;
public NumberType numberType;
// .......
@Override
public int compareTo (PhoneNumber rhs) {
int result = this.numberType.compareTo(rhs.numberType);
if (result == 0) {
result = this.number.compareTo(rhs.number);
}
return result;
}
}
然后你可以打电话:
arrayList.sort()
您仍然需要将NumberType 设为enum,如第一种方法中所述。上面的compareTo() 实现依赖于NumberType 是Comparable;所有enum 实例都自动成为Comparable。
注意Comparator 和compareTo() 实现之间的相似之处和不同之处。 Comparator 和 Comparable can be found here 的一个很好的讨论。