系列文章目录
Arrays课堂练习
题目
代码
(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
类型,而价格price
是double
类型,需要转换一下,即当差值>0时,返回一个整数,否则返回另一个整数。不能强制类型转换,这样不准确,如100.5-100
强制转换后为0
,但其实两个价格不相等。