java - 按对象方法的值对数组列表进行排序

标签 java sorting arraylist

我想整理一下我的Arraylist<Book> b关于方法 numPoints() 返回的值上课Bookshow()是类 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 方法接受 ComparatorComparator 的工作是比较对象。

函数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/

相关文章:

java - java中的ArrayList不删除-1

java - 在包 'layout_alignParentEnd' Activity_post.xml/DispatchActivity/res/layout 第 23 行中找不到属性 'android' 的资源标识符

json - 如何使用 jq 对输出进行排序/唯一

java - 如何在数组列表中存储新对象而不删除现有对象一次

Java - 从 ArrayList 中删除最后一个已知项目

python - 为多个数组实现 numpy.in1d 的最有效方法

java - 基于中间件的 HTTP/JMS 混合 SOAP 的请求-回复模型

java - 如何验证Spring MVC Web应用程序中是否已设置连接池?

java - hibernate - SQLGrammarException : could not extract ResultSet on Persist

java - 在 JPA 事件实体上实现绝对排序