P485 0484_韩顺平Java_Arrays课堂练习

文章讲述了使用Java编程中的接口匿名内部类、泛型以及定制排序(包括Arrays.sort和冒泡排序)在实际场景中的应用,通过实例演示如何按不同条件对Book对象数组进行排序。
摘要由CSDN通过智能技术生成

系列文章目录



题目

在这里插入图片描述


代码

(1)自己写的:1.(用了接口匿名内部类的泛型;2.定制排序分为两种:①Arrays.sort()的定制排序。②冒泡+定制排序。

代码如下:

package com.hspedu.arrays_;

import java.util.Arrays;
import java.util.Comparator;

public class ArrayExercise {
    public static void main(String[] args) {
        Book[] books = new Book[4];
        books[0] = new Book("红楼梦", 100);
        books[1] = new Book("金瓶梅新", 90);
        books[2] = new Book("青年文摘20年", 5);
        books[3] = new Book("java从入门到放弃~", 300);
        //(1)从大到小排(Arrays.sort()的定制排序)
        System.out.println("从大到小排");
        Arrays.sort(books, new Comparator<Book>() {
            @Override
            public int compare(Book o1, Book o2) {
                double priceo1 = o1.getPrice();
                double priceo2 = o2.getPrice();
                if ((priceo2 - priceo1) < 0) {
                    return -1;
                } else {
                    return 1;
                }
            }
        });
        for (int i = 0; i < books.length; i++) {
            System.out.println(books[i]);
        }
        //(2)从小到大排(Arrays.sort()的定制排序)
        System.out.println("从小到大排");
        Arrays.sort(books, new Comparator<Book>() {
            @Override
            public int compare(Book o1, Book o2) {
                double priceo1 = o1.getPrice();
                double priceo2 = o2.getPrice();
                if ((priceo1 - priceo2) < 0) {
                    return -1;
                } else {
                    return 1;
                }
            }
        });
        for (int i = 0; i < books.length; i++) {
            System.out.println(books[i]);
        }
        //(3)按照书名长度从大到小排(Arrays.sort()的定制排序)
        System.out.println("按照书名长度从大到小排");
        Arrays.sort(books, new Comparator<Book>() {
            @Override
            public int compare(Book o1, Book o2) {
                int lengtho1 = o1.getName().length();
                int lengtho2 = o2.getName().length();
                return lengtho2 - lengtho1;
            }
        });
        for (int i = 0; i < books.length; i++) {
            System.out.println(books[i]);
        }
        //(4)按照书名长度从小到大排(冒泡+定制排序)
        System.out.println("按照书名长度从小到大排");
        Bubble01.BubbleSort(books, new Comparator<Book>() {
            @Override
            public int compare(Book o1, Book o2) {
                int lengtho1 = o1.getName().length();
                int lengtho2 = o2.getName().length();
                return lengtho1 - lengtho2;
            }
        });
        for (int i = 0; i < books.length; i++) {
            System.out.println(books[i]);
        }
    }
}

class Book {
    private String name;
    private double price;

    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

//创建一个类,有一个静态方法实现冒泡+定制排序
class Bubble01 {
    public static void BubbleSort(Book[] books, Comparator c) {
        for (int i = 0; i < books.length - 1; i++) {
            for (int j = 0; j < books.length - 1 - i; j++) {
                if (c.compare(books[j], books[j + 1]) > 0) {
                    Book tempBook = books[j + 1];
                    books[j + 1] = books[j];
                    books[j] = tempBook;
                }
            }
        }
    }
}

结果如下:

在这里插入图片描述

(2)老师写的:1.没用接口匿名内部类的泛型,使用了多态的向上转型和向下转型。2.定制排序使用了Arrays.sort()的定制排序。

代码如下:

package com.hspedu.arrays_;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @author 韩顺平
 * @version 1.0
 */
public class ArrayExercise {
    public static void main(String[] args) {
        /*
        案例:自定义Book类,里面包含name和price,按price排序(从大到小)。
        要求使用两种方式排序 , 有一个 Book[] books = 4本书对象.

        使用前面学习过的传递 实现Comparator接口匿名内部类,也称为定制排序。
        [同学们完成这个即可 10min  ],
        可以按照 price (1)从大到小 (2)从小到大 (3) 按照书名长度从大到小

         */

        Book[] books = new Book[4];
        books[0] = new Book("红楼梦", 100);
        books[1] = new Book("金瓶梅新", 90);
        books[2] = new Book("青年文摘20年", 5);
        books[3] = new Book("java从入门到放弃~", 300);

        //(1)price从大到小
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此  o1 和 o2 就是Book对象
            @Override
            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                double priceVal = book2.getPrice() - book1.getPrice();
                //这里老师进行了一个转换
                //如果发现返回结果和我们输出的不一致,就修改一下返回的 1 和 -1
                if(priceVal > 0) {
                    return  1;
                } else  if(priceVal < 0) {
                    return -1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println(Arrays.toString(books));

        //(2)price从小到大
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此  o1 和 o2 就是Book对象
            @Override
            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                double priceVal = book2.getPrice() - book1.getPrice();
                //这里老师进行了一个转换
                //如果发现返回结果和我们输出的不一致,就修改一下返回的 1 和 -1
                if(priceVal > 0) {
                    return  -1;
                } else  if(priceVal < 0) {
                    return 1;
                } else {
                    return 0;
                }
            }
        });
        System.out.println(Arrays.toString(books));

        //(3)按照书名长度从大到小
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此  o1 和 o2 就是Book对象
            @Override
            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o2;
                //要求按照书名的长度来进行排序
                return book2.getName().length() - book1.getName().length();
            }
        });
        System.out.println(Arrays.toString(books));

    }
}

class Book {
    private String name;
    private double price;

    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

结果如下:

在这里插入图片描述


注:

重写接口匿名内部类的public int compare()方法时,注意返回值是int类型,而价格pricedouble类型,需要转换一下,即当差值>0时,返回一个整数,否则返回另一个整数。不能强制类型转换,这样不准确,如100.5-100强制转换后为0,但其实两个价格不相等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值