通过对象方法的值对arraylist进行排序

时间:2018-01-14 00:10:04

标签: java sorting arraylist

我希望对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

有人可以帮我弄清楚出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

您似乎对使用代码感兴趣,而不是从头开始实现排序。

只需使用已经实现的列表排序方法:

ArrayList<Book> list;
list.sort(Comparator.comparing(Book::numPoints));

sort方法接受ComparatorComparator的工作是比较对象。

函数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();
            }
});