我想整理一下我的Arraylist<Book> b
关于方法 numPoints()
返回的值上课Book
。 show()
是类 Book
的方法,打印出代码。
其他一切都正常,只是方法 sort()
这是我认为的问题。
public class som {
private static ArrayList<Book> b;
public static void main(String[] args) {
b = new ArrayList<Book>();
...
}
...
public static void sort() {
Book mon = null;
int indMax = 0;
for(int i=0; i<b.size()-1; i++){
mon = b.get(i);
indMax = i;
for(int j=i+1; j<b.size(); j++){
if(b.get(j).numPoints() > mon.numPoints()){
mon = b.get(j);
}
}
if(indMax != i){
b.set(indMax, b.get(i));
b.set(i, mon);
}
}
for(int s=0; s<b.size(); s++) {
b.get(j).show();
}
}
class Book {
...
public double numPoints() {
...
}
public void show() {
...
}
...
}
我也尝试了以下代码,但它们都不能正常工作。
public static void sort() {
ArrayList<Book> o = new ArrayList<Book>();
double vMax=0;
int iMax=0;
while(b.size()!=0) {
for(int i = 0; i<b.size(); i++) {
if(vMax<b.get(i).numPoints()) {
vMax=b.get(i).numPoints();
iMax=i;
}
}
o.add(b.get(iMax));
b.remove(iMax);
}
for(int j=0; j<o.size(); j++) {
o.get(j).show();
}
第一个无法正常工作,但在第二个中终端打印出:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
有人可以帮我找出问题所在吗?
最佳答案
您似乎对工作代码感兴趣,而不是从头开始实现排序。
只需使用已实现的列表排序方法:
ArrayList<Book> list;
list.sort(Comparator.comparing(Book::numPoints));
sort
方法接受 Comparator
。Comparator
的工作是比较对象。
函数Comparator.comparing
创建比较器。它接受一个函数
参数。 Function
的工作是提供要比较的对象的替代品。所以可以用替代品来进行比较。
因为您想通过 Book.numPoints
方法返回的内容来比较 Book
,所以我们需要为每个 Book
返回创建一个函数Book.numPoints
方法的结果。因为Function
是一个函数式接口(interface),我们可以使用方法引用(Book::numPoints
)来提供函数。
然后你可以对所有这些调用show
:
list.forEach(Book::show)
不仅简单,而且易于修改。
关于java - 按对象方法的值对数组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245511/