如何在Java中对对象数组进行排序?

Tus*_*rul 33 java arrays sorting string object

我的数组不包含任何字符串.但它包含对象引用.每个对象引用都通过toString方法返回name,id,author和publisher.

public String toString() {
        return (name + "\n" + id + "\n" + author + "\n" + publisher + "\n");
}
Run Code Online (Sandbox Code Playgroud)

现在我需要按名称对对象数组进行排序.我知道如何排序,但我不知道如何从对象中提取名称并对它们进行排序.

zbe*_*ess 39

你可以尝试这样的事情:

List<Book> books = new ArrayList<Book>();

Collections.sort(books, new Comparator<Book>(){

  public int compare(Book o1, Book o2)
  {
     return o1.name.compareTo(o2.name);
  }
});
Run Code Online (Sandbox Code Playgroud)


A4L*_*A4L 31

您有两种方法可以使用Arrays实用程序类

  1. 实现Comparator并将数组与比较器一起传递给sort方法,该方法将其作为第二个参数.
  2. 在对象所在的类中实现Comparable接口,并将数组传递给只接受一个参数的sort方法.

class Book implements Comparable<Book> {
    public String name, id, author, publisher;
    public Book(String name, String id, String author, String publisher) {
        this.name = name;
        this.id = id;
        this.author = author;
        this.publisher = publisher;
    }
    public String toString() {
        return ("(" + name + ", " + id + ", " + author + ", " + publisher + ")");
    }
    @Override
    public int compareTo(Book o) {
        // usually toString should not be used,
        // instead one of the attributes or more in a comparator chain
        return toString().compareTo(o.toString());
    }
}

@Test
public void sortBooks() {
    Book[] books = {
            new Book("foo", "1", "author1", "pub1"),
            new Book("bar", "2", "author2", "pub2")
    };

    // 1. sort using Comparable
    Arrays.sort(books);
    System.out.println(Arrays.asList(books));

    // 2. sort using comparator: sort by id
    Arrays.sort(books, new Comparator<Book>() {
        @Override
        public int compare(Book o1, Book o2) {
            return o1.id.compareTo(o2.id);
        }
    });
    System.out.println(Arrays.asList(books));
}
Run Code Online (Sandbox Code Playgroud)

产量

[(bar, 2, author2, pub2), (foo, 1, author1, pub1)]
[(foo, 1, author1, pub1), (bar, 2, author2, pub2)]
Run Code Online (Sandbox Code Playgroud)


ROM*_*eer 24

Java 8


使用lambda表达式

Arrays.sort(myTypes, (a,b) -> a.name.compareTo(b.name));
Run Code Online (Sandbox Code Playgroud)

Test.java

public class Test {

    public static void main(String[] args) {

        MyType[] myTypes = {
                new MyType("John", 2, "author1", "publisher1"),
                new MyType("Marry", 298, "author2", "publisher2"),
                new MyType("David", 3, "author3", "publisher3"),
        };

        System.out.println("--- before");
        System.out.println(Arrays.asList(myTypes));
        Arrays.sort(myTypes, (a, b) -> a.name.compareTo(b.name));
        System.out.println("--- after");
        System.out.println(Arrays.asList(myTypes));

    }

}
Run Code Online (Sandbox Code Playgroud)

MyType.java

public class MyType {

    public String name;
    public int id;
    public String author;
    public String publisher;

    public MyType(String name, int id, String author, String publisher) {
        this.name = name;
        this.id = id;
        this.author = author;
        this.publisher = publisher;
    }

    @Override
    public String toString() {
        return "MyType{" +
                "name=" + name + '\'' +
                ", id=" + id +
                ", author='" + author + '\'' +
                ", publisher='" + publisher + '\'' +
                '}' + System.getProperty("line.separator");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

--- before
[MyType{name=John', id=2, author='author1', publisher='publisher1'}
, MyType{name=Marry', id=298, author='author2', publisher='publisher2'}
, MyType{name=David', id=3, author='author3', publisher='publisher3'}
]
--- after
[MyType{name=David', id=3, author='author3', publisher='publisher3'}
, MyType{name=John', id=2, author='author1', publisher='publisher1'}
, MyType{name=Marry', id=298, author='author2', publisher='publisher2'}
]
Run Code Online (Sandbox Code Playgroud)

使用方法引用

Arrays.sort(myTypes, MyType::compareThem);
Run Code Online (Sandbox Code Playgroud)

其中,compareThem已经在加入MyType.java:

public static int compareThem(MyType a, MyType b) {
    return a.name.compareTo(b.name);
}
Run Code Online (Sandbox Code Playgroud)


shr*_*yog 8

Java 8结构的更新

假设一个Book类具有name字段获取器,则可以Arrays.sort通过传递Comparator使用Java 8构造体指定的附加值来使用method- 比较器默认方法方法引用

Arrays.sort(bookArray, Comparator.comparing(Book::getName));
Run Code Online (Sandbox Code Playgroud)

同样,可以使用thenComparing方法在多个字段上进行比较。

Arrays.sort(bookArray, Comparator.comparing(Book::getName)
      .thenComparing(Book::getAuthor))
      .thenComparingInt(Book::getId));
Run Code Online (Sandbox Code Playgroud)