该文章代码来源《Thinking In Java》。
这里主要学习的是java数组排序和生成器Generator的实现和运用。
首先介绍生成器类:Generator.java
package array;
public interface Generator<T> {
T next();
}
再来介绍CollectionData.java类,该类主要用于创建一个Collection对象,该对象中所填充的元素是由生成器gen所产生的,而元素的数量则由其他参数设定。所有的Collection子类型都有toArray()方法,该方法将使用Collection中的元素填充参数数组。
CollectionData.java类:
package array;
import java.util.ArrayList;
public class CollectionData<T> extends ArrayList<T> {
public CollectionData(Generator<T> gen,int quantity){
for(int i=0;i<quantity;i++){
this.add(gen.next());
}
}
// A generic convenience method.
public static <T> CollectionData<T> list(Generator<T> gen,int quantity){
return new CollectionData<T>(gen, quantity);
}
}
为了从Generator中创建数组,我们需要两个转换工具,第一个工具使用任意的Generator来产生Object子类型的数组。为了处理基本类型,第二个工具接收任意基本类型的包装器类型数组,并产生相应的基本类型数组。
第一个工具有两种选项,并由重载的静态方法array()来表示。该方法的第一个版本接收一个已有的数组,并使用某个Generator来填充它,而第二个版本接收一个Class对象、一个已有的数组和所需的元素数量,然后创建一个新数组,并使用所接收的Generator来填充它。注意,这个工具只能产生Object子类型的数组,而不能产生基本类型数组。
最后来介绍:CompType.java
要实现排序,运用刚才介绍的Generated类利用生成器填充该类型的数组。
package array;
import java.util.Arrays;
import java.util.Random;
public class CompType implements Comparable<CompType> {
int i;
int j;
private static int count=1;
public CompType(int n1,int n2){
i=n1;
j=n2;
}
public String toString(){
String result="[i=" + i + ",j=" + j+ "]";
if(count++ %3==0){
result+="\n";
}
return result;
}
@Override
public int compareTo(CompType o) {
// TODO Auto-generated method stub
return (i<o.i ? -1:(i==o.i ?0:1));
}
private static Random r =new Random(47);
public static Generator<CompType> generator(){
return new Generator<CompType>(){
public CompType next(){
return new CompType(r.nextInt(100),r.nextInt(100));
}
};
}
@SuppressWarnings("null")
public static void main(String args[]){
CompType[] a=Generated.array(new CompType[12], generator());
System.out.println("before sorting:");
System.out.println(Arrays.toString(a));
Arrays.sort(a);
System.out.println("after sorting");
System.out.println(Arrays.toString(a));
}
}