定义一个Book类,该类有四个成员变量:书的编号id、书名name、书的价格price、出版日期date。并重写Object类的toString()方法。定义测试类BookUseComparator
new Book(11, "程序设计", 59.8, new GregorianCalendar(2009, 0, 1))
new Book(2, "操作系统", 89.68, new GregorianCalendar(2008, 7, 8))
new Book(3, "中国历史", 35.8, new GregorianCalendar(2008, 6, 8))
要求分别按照正常加入的顺序、以及按照书的编号、书的价格、书的出版日期升序输出。
测试结果如下:
package pack;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.GregorianCalendar;
public class BookUseComparator {
public static void main(String[] args) {
ArrayList<BOOk> array = new ArrayList<BOOk>();
BOOk bk = new BOOk(11, "程序设计", 59.8, new GregorianCalendar(2009, 0, 1));
BOOk bk1 = new BOOk(2, "操作系统", 89.68, new GregorianCalendar(2008, 7, 8));
BOOk bk2 = new BOOk(3, "中国历史", 35.8, new GregorianCalendar(2008, 6, 8));
array.add(bk);
array.add(bk1);
array.add(bk2);
System.out.println("按照正常顺序排序如下");
display(array);
System.out.println("-------------------------");
System.out.println("按照书的编号从小到大排列");
Collections.sort(array, new Comparator<BOOk>() {
@Override
public int compare(BOOk o1, BOOk o2) {
// TODO Auto-generated method stub
int num1=o1.getId()-o2.getId();
return num1;
}
});
display(array);
System.out.println("-------------------------");
System.out.println("按照书的价格从小到大排列");
Collections.sort(array, new Comparator<BOOk>() {
@Override
public int compare(BOOk o1, BOOk o2) {
// TODO Auto-generated method stub
Double d1 = new Double(o1.getPrice());
Double d2 = new Double(o1.getPrice());
int num1=d1.compareTo(d2);
int num2=num1==0?o2.getId()-o1.getId():num1;
return num2;
}
});
display(array);
System.out.println("-------------------------");
System.out.println("按照书的出版日期从小到大排列");
Collections.sort(array, new Comparator<BOOk>() {
@Override
public int compare(BOOk o1, BOOk o2) {
// TODO Auto-generated method stub
int num1=o1.getDate().compareTo(o2.getDate());
int num2=num1==0?o2.getId()-o1.getId():num1;
return num2;
}
});
display(array);
}
private static void display(ArrayList<BOOk> array) {
// TODO Auto-generated method stub
for(BOOk b:array) {
System.out.println(b);
}
}
}
Demo中的几点说明;
1.使用List接口中ArrayList的实现类,该实现类内部是一个数组结构,在查找和遍历元素十分方便。该类的泛型为<Book>类型。
2.使用array.add()方法把Book类型的数据添加进入集合中。同时输出的时候重新定义了一个display()方法,
private static void display(ArrayList<BOOk> array) { // TODO Auto-generated method stub for(BOOk b:array) { System.out.println(b); } }
该方法的参数必须是ArrayList<book>类型,方法内部使用了一个增强for循环进行遍历。
2.使用集合工具类Collections中的sort方法, 并且以定制排序方式进行,Comparator方法是在外部定制排序规则,然后作为排序策略参数传递给某些类,比如Collections.sort和Arrays.sort。使用匿名内部类创建步骤分为:
(1)创建一个Comparator接口的实现类,并赋值给一个对象。
(2)重写compare方法。
Collections.sort(array, new Comparator<BOOk>() { @Override public int compare(BOOk o1, BOOk o2) { // TODO Auto-generated method stub int num1=o1.getDate().compareTo(o2.getDate()); int num2=num1==0?o2.getId()-o1.getId():num1; return num2; } });
2.Book类的定义
package pack;
import java.util.Date;
import java.util.GregorianCalendar;
public class BOOk {
private int id;
private String name;
private float price;
private GregorianCalendar date;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public GregorianCalendar getDate() {
return date;
}
public void setDate(GregorianCalendar date) {
this.date = date;
}
public BOOk(int id, String name, double d, GregorianCalendar gregorianCalendar) {
super();
this.id = id;
this.name = name;
this.price = (float) d;
this.date = gregorianCalendar;
}
@Override
public String toString() {
return id +"\t"+ name +"\t\t "+price+"\t"+String.format("%tY年%<tm月%<td日", date);
}
}
1.对于定义日期,我们最初想的是Date,但由于Date没有考虑国际化问题,JDK1.1之后就被Calendar类所取代,由于Calendar类是抽象类,不能被实例化,一般需要使用静态方法getInstance来得到一个Calender对象,或者使用子类GregorianCalendar来创建对象。
2.对于日期格式化我们采用的是String.format。
你想问啥。