List+匿名内部类定制排序

 需求--

定义一个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);
                }
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值