我希望对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();
}
第一个没有正常工作,但在第二个终端打印出来:
有人可以帮我弄清楚出了什么问题吗?线程中的异常&#34; main&#34; java.lang.IndexOutOfBoundsException:Index:2,Size:2
答案 0 :(得分:1)
您似乎对使用代码感兴趣,而不是从头开始实现排序。
只需使用已经实现的列表排序方法:
ArrayList<Book> list;
list.sort(Comparator.comparing(Book::numPoints));
sort
方法接受Comparator
。Comparator
的工作是比较对象。
函数Comparator.comparing
创建比较器。它接受一个Function
的参数。 Function
的工作是为可比较的对象提供替代。所以可以替代替代品。
因为您希望通过Book
方法返回来比较Book.numPoints
,我们需要创建一个函数,为每个Book
返回Book.numPoints
方法的结果。因为Function
是一个功能接口,我们可以使用方法引用(Book::numPoints
)来提供函数。
然后你可以在所有人身上调用show
:
list.forEach(Book::show)
不仅简单,而且易于修改。
答案 1 :(得分:1)
对于java&gt; = java 8
b.sort((b1,b2)-> b1.numPoints()-b2.numPoints());
对于java&lt; java 8
Collections.sort(b,new Comparator<Book>{
@Override
public int compare(Book b1, Book b2) {
return b1.numPoints() - b2.numPoints();
}
});