需求--
定义一个Book类,有三个属性,书名,作者,价格
现需要定义三个List型的对象放入集合(使用ArrayList集合)
并对集合内元素根据书的价格高低进行排序(从低-->到高)
思路分析--
1.首先看需求,先创建一个Book类,定义好属性以及构造器
2.使用ArrayList集合,然后调用add方法,添加新元素,这里添加方式直接创建对象即可
3.在类中我们编写一个方法,形参传入一个List型的集合,一个Comparator型的接口,我们采用冒泡法排序,但我们采用定制排序,用匿名内部类实现
既然采用冒泡法,那么两层循环是必须的,这里不多解释,不懂的可以看下冒泡排序
这里重头戏来了!!
我们需要先用ArrayList的get()方法,获得一个元素,这个元素其实就是一个Book型的对象,因为我们需要获得这个书的价格,所以我们要将这个get到的元素向下转型为Book型的对象
那么我们进行两次这样的操作,获得两个这样的对象,用传进来的接口调用compare方法,传入这两个对象,进行返回值的判断,然后进行交换操作
在主方法中,我们调用这个方法的时候,我们需要用到匿名内部类,参数传入一个我们已赋值好的集合,一个new出来的接口,匿名内部类就是实现该接口的子类!!!
重写该接口的compare方法,将这两个对象向下转型成Book类型的,然后分别调用这两个对象的get方法获得价格并相减,然后转为整型,把这个值作为int型返回值让排序方法内的if语句去判断是否执行交换。
public class ListExercise02 {
@SuppressWarnings("all")
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Book("斗罗大陆", "唐家三少", 187.3));
list.add(new Book("三体", "刘慈欣", 233.9));
list.add(new Book("武庚纪", "郑健和与邓志辉", 332.3));
System.out.println(list);
Book.priceRes(list, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Book book1 = (Book) o1;
Book book2 = (Book) o2;
return (int) (book1.getPrice() - book2.getPrice());
}
});
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object book = iterator.next();
System.out.println(book);
}
}
}
@SuppressWarnings("all")
class Book {
private String name;
private String author;
private double price;
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
public static void priceRes(List list, Comparator comparator) {
for (int i = 0; i < list.size() - 1; i++) {
for (int j = 0; j < list.size() - 1 - i; j++) {
if (comparator.compare(list.get(j), list.get(j+1)) > 0) {
Object count = list.get(j);
list.set(j,list.get(j+1));
list.set(j+1,count);
}
}
}
}
}