Arrays.sort()你应该知道的事
来源:互联网 发布:网络中的涵化理论 编辑:程序博客网 时间:2024/06/08 18:35
Arrays.sort()你应该知道的事
本文由 ImportNew - 刘志军 翻译自 programcreek。如需转载本文,请先参见文章末尾处的转载要求。
ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。
Arrays.sort(T[], Comparator < ? super T > c) 是用来对用户自定义的对象数组排序功能的。Java 官方文档简单描述了它的作用,但不足以让我们深刻理解。在这篇文章中,我将顺着一下关键点息做个比较深入的理解。
1、简单实例:如何使用Arrays.sort()
通过阅读下面代码,你能快速正确了解这个方法的用途。Comparator(比较器)用于根据Dogs的size比较其大小,并作为sort方法的参数。
import
java.util.Arrays;
import
java.util.Comparator;
class
Dog{
int
size;
public
Dog(
int
s){
size = s;
}
}
class
DogSizeComparator
implements
Comparator<Dog>{
@Override
public
int
compare(Dog o1, Dog o2) {
return
o1.size - o2.size;
}
}
public
class
ArraySort {
public
static
void
main(String[] args) {
Dog d1 =
new
Dog(
2
);
Dog d2 =
new
Dog(
1
);
Dog d3 =
new
Dog(
3
);
Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);
Arrays.sort(dogArray,
new
DogSizeComparator());
printDogs(dogArray);
}
public
static
void
printDogs(Dog[] dogs){
for
(Dog d: dogs)
System.out.print(d.size +
" "
);
System.out.println();
}
}
2
1
3
1
2
3
2、策略模式的使用
这是运用策略模式的一个很好的场景,为什么策略模式对于这种场景非常适用?简单来说,策略模式使不同的算法在运行时得以选择。在这个例子中,通过传递不同的Comparator,可以选择不同的算法。基于上例,现在假设你有一个Comparator,用weight来代替size来比较Dogs。你可以简单创建一个新的Comprator如下:
class
Dog{
int
size;
int
weight;
public
Dog(
int
s,
int
w){
size = s;
weight = w;
}
}
class
DogSizeComparator
implements
Comparator<Dog>{
@Override
public
int
compare(Dog o1, Dog o2) {
return
o1.size - o2.size;
}
}
class
DogWeightComparator
implements
Comparator<Dog>{
@Override
public
int
compare(Dog o1, Dog o2) {
return
o1.weight - o2.weight;
}
}
public
class
ArraySort {
public
static
void
main(String[] args) {
Dog d1 =
new
Dog(
2
,
50
);
Dog d2 =
new
Dog(
1
,
30
);
Dog d3 =
new
Dog(
3
,
40
);
Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);
Arrays.sort(dogArray,
new
DogSizeComparator());
printDogs(dogArray);
Arrays.sort(dogArray,
new
DogWeightComparator());
printDogs(dogArray);
}
public
static
void
printDogs(Dog[] dogs){
for
(Dog d: dogs)
System.out.print(
"size="
+d.size +
" weight="
+ d.weight +
" "
);
System.out.println();
}
}
输出:
size=
2
weight=
50
size=
1
weight=
30
size=
3
weight=
40
size=
1
weight=
30
size=
2
weight=
50
size=
3
weight=
40
size=
1
weight=
30
size=
3
weight=
40
size=
2
weight=
50
Comparator仅仅是一个接口,任何实现了Comparator在运行时都可以被使用,这是策略模式的核心理念。
3、为什么使用“super”
很显然,如果”Comparator<T>c”作为参数,但是第二个参数是”Comparator< ? super T > c”,使用<? super T>意味着类型可以是T或者是它的超类。为什么允许超类型呢?答案是:这种方式允许所有子类使用同一个comparator。看看下面这个例子一目了然。
import
java.util.Arrays;
import
java.util.Comparator;
class
Animal{
int
size;
}
class
Dog
extends
Animal{
public
Dog(
int
s){
size = s;
}
}
class
Cat
extends
Animal{
public
Cat(
int
s){
size = s;
}
}
class
AnimalSizeComparator
implements
Comparator<Animal>{
@Override
public
int
compare(Animal o1, Animal o2) {
return
o1.size - o2.size;
}
//in this way, all sub classes of Animal can use this comparator.
}
public
class
ArraySort {
public
static
void
main(String[] args) {
Dog d1 =
new
Dog(
2
);
Dog d2 =
new
Dog(
1
);
Dog d3 =
new
Dog(
3
);
Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);
Arrays.sort(dogArray,
new
AnimalSizeComparator());
printDogs(dogArray);
System.out.println();
//when you have an array of Cat, same Comparator can be used.
Cat c1 =
new
Cat(
2
);
Cat c2 =
new
Cat(
1
);
Cat c3 =
new
Cat(
3
);
Cat[] catArray = {c1, c2, c3};
printDogs(catArray);
Arrays.sort(catArray,
new
AnimalSizeComparator());
printDogs(catArray);
}
public
static
void
printDogs(Animal[] animals){
for
(Animal a: animals)
System.out.print(
"size="
+a.size +
" "
);
System.out.println();
}
}
size=
2
size=
1
size=
3
size=
1
size=
2
size=
3
size=
2
size=
1
size=
3
size=
1
size=
2
size=
3
4、总结
总的来说,从Arrays.sort()中你应该了解到:
- generic(范型)——super
- 策略模式
- 归并排序——nlog(n)时间复杂度
- java.util.Collections.sort(List<T>list, Comparator<?super T> c)类似于Arrays.sort
- Arrays.sort()你应该知道的事
- Arrays.sort()排序你应该知道的事
- 你应该知道的
- JDBC 你应该知道的事
- 作为程序员你应该知道的事
- Codeforces 你应该知道的事
- SurfaceView你所应该知道的事
- Fragment你应该知道的那些事
- GSON你应该知道的事
- Android Notification 你应该知道的事
- cookies你应该知道的
- session你应该知道的
- 你应该知道的Unicode
- 你应该知道的print
- 你应该知道的ThreadPoolExecutor
- 你应该知道的统计学
- Silverlight,你应该知道的10件事
- Silverlight,你应该知道的10件事
- 过了正月十五春天就算来了
- poj 1414 DP
- Java数据库编程---事务处理
- vmware+ubuntu文件夹共享
- win7 64bit下eclipse启动tomcat出现OOM(out of memory)
- Arrays.sort()你应该知道的事
- poj 3461 Oulipo KMP算法
- 两个两位数,它们的差是25
- 做软件的也得注意休息啊
- UVa 10916 超级计算机
- RHadoop安装
- linux命令之login命令
- OMAPL138学习---typedef int(init_fnc_t)(void)
- 修改EBS R12界面LOGO