学习时从网上找到一段小程序,是有关怎样使用Array.sort的。跑起来没问题。但还是有几点不理解,希望各位指点package a;
import java.util.Arrays;
import java.util.Comparator;public class ArraySortDemo {
/**
 * 整数型数组排序
 */
public void sortIntArray() {
int[] arrayToSort = new int[] { 48, 5, 89, 80, 81, 23, 45, 16, 2 };
System.out.println("整数型数组排序,排序前:");
for (int i = 0; i < arrayToSort.length; i++) {
System.out.print(arrayToSort[i] + ",");
}
// 调用数组的静态排序方法sort
Arrays.sort(arrayToSort);
System.out.println();
System.out.println("排序后:");
for (int i = 0; i < arrayToSort.length; i++) {
System.out.print(arrayToSort[i] + ",");
}
} /**
 * 字符型数组排序demo
 */
public void sortStringArray() {
String[] arrayToSort = new String[] { "Oscar", "Charlie", "Ryan",
"Adam", "David", "aff", "Aff" };
System.out.println();
System.out.println("字符型数组排序,排序前:");
for (int i = 0; i < arrayToSort.length; i++) {
System.out.print(arrayToSort[i] + ",");
}
System.out.println();
System.out.println("排序后:");
// 调用数组的静态排序方法sort
Arrays.sort(arrayToSort); for (int i = 0; i < arrayToSort.length; i++) {
System.out.print(arrayToSort[i] + ",");
}
} /**
 * 对象数组排序demo
 */
public void sortObjectArray() {
Dog o1 = new Dog("dog1", 1);
Dog o2 = new Dog("dog2", 4);
Dog o3 = new Dog("dog3", 5);
Dog o4 = new Dog("dog4", 2);
Dog o5 = new Dog("dog5", 3);
Dog[] dogs = new Dog[] { o1, o2, o3, o4, o5 };
System.out.println();
System.out.println("对象数组排序排序前:");
for (int i = 0; i < dogs.length; i++) {
Dog dog = dogs[i];
System.out.print(dog.getName() + "[" + dog.getWeight() + "],");
}
Arrays.sort(dogs, new ByWeightComparator());
System.out.println();
System.out.println("排序后:");
for (int i = 0; i < dogs.length; i++) {
Dog dog = dogs[i];
System.out.print(dog.getName() + "[" + dog.getWeight() + "],");
}
} public static void main(String[] args) {
ArraySortDemo t = new ArraySortDemo();
t.sortIntArray();
t.sortStringArray();
t.sortObjectArray();
}
}/**
 * 定义了一个Dog类
 */
class Dog {
private String name;
private int weight; public Dog(String name, int weight) {
this.setName(name);
this.weight = weight;
} public int getWeight() {
return weight;
} public void setWeight(int weight) {
this.weight = weight;
} public void setName(String name) {
this.name = name;
} public String getName() {
return name;
}
}/**
 * 因为要对对象进行排序,所以要实现java.util.Comparator接口的compare(T o1, T o2)方法,在该方法中自定义排序算法。
 */
class ByWeightComparator implements Comparator<Dog> {
public final int compare(Dog pFirst, Dog pSecond) {
int aFirstWeight = pFirst.getWeight();
int aSecondWeight = pSecond.getWeight();
int diff = aFirstWeight - aSecondWeight;
if (diff > 0)
return 1;
if (diff < 0)
return -1;
else
return 0;
}
}1.“实现接口的类要实现接口的所有方法,否则应该将实现接口部分方法的那个类声明为abstract”。javadoc里面说Interface Comparator有两个方法,一个是compare,还有一个是equal,为什么ByWeightComparator没有实现equal,程序也没有问题?
2. “interface 默认都是public abstract 的”, 这里的ByWeightComparator class是default的,这不就是降低了原interface的可见性了吗,为什么没有错?(是不是接口里没有reduce visibility这么一说?)
3. 如果哪位对comparable,comparator和Arrays.sort的关系比较了解,请指教。
谢谢!!!

解决方案 »

  1.   

    我傻
    equals是java.lang.object的方法
    都说“所有类都继承了object”,那interface也继承object?
      

  2.   

    我的意思是所有类都可以继承object,接口也可以继承object?
      

  3.   

    接口就是object中的,java中的类和接口都是对象,只要是对象就继承object
      

  4.   

    “interface 默认都是public abstract 的”这个不一定,在设计模式factory模式中,接口中还可以以接口作为方法返回值类型,之所以用abstract修饰,是为了让实现接口的类重载接口方法,目的是为了把多个类的一些方法放入接口然后重载,如果其中某个类没有某个方法属性则不用重载,主要是使程序的耦合性降低。
    compare,equal是abstract类型的方法,所以不用重载也没问题,一般在collection(集合)这个地方要重载它,比较不同value值的hashcode值是否相同(一般是不相同,因为2个key值不能对应一个value)。
    comparator实现comparable接口也是大多数用于collection,Arrays.sort是数组的排序,和前两个没什么关系