Как отсортировать массив объектов в Java?
Мой массив не содержит никакой строки. Но он содержит ссылки на объекты. Каждая ссылка на объект возвращает имя, идентификатор, автора и издателя методом toString.
public String toString() {
return (name + "\n" + id + "\n" + author + "\n" + publisher + "\n");
}
Теперь мне нужно отсортировать этот массив объектов по имени. Я знаю, как сортировать, но я не знаю, как извлечь имя из объектов и отсортировать их.
Ответы
Ответ 1
У вас есть два способа сделать это: оба используют Arrays служебный класс
- Внесите Comparator и передайте массив вместе с компаратором метод сортировки, который принимает это второй параметр.
- Внедрите Comparable интерфейс в классе, из которого ваши объекты и передают ваш массив, в метод сортировки , который принимает только один параметр.
Пример
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));
}
Выход
[(bar, 2, author2, pub2), (foo, 1, author1, pub1)]
[(foo, 1, author1, pub1), (bar, 2, author2, pub2)]
Ответ 2
Вы можете попробовать что-то вроде этого:
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);
}
});
Ответ 3
Java 8
Arrays.sort(myTypes, (a,b) -> a.name.compareTo(b.name));
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));
}
}
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");
}
}
Вывод:
--- 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'}
]
Arrays.sort(myTypes, MyType::compareThem);
где compareThem
должен быть добавлен в MyType.java:
public static int compareThem(MyType a, MyType b) {
return a.name.compareTo(b.name);
}
Ответ 4
Обновление для конструкций Java 8
Предполагая, что класс Book
Arrays.sort
метод получения поля name
, вы можете использовать метод Arrays.sort
, передав дополнительный Comparator
указанный с помощью конструкций Java 8 - метод и ссылки на метод по умолчанию для компаратора.
Arrays.sort(bookArray, Comparator.comparing(Book::getName));
Кроме того, можно сравнивать несколько полей, используя методы thenComparing
.
Arrays.sort(bookArray, Comparator.comparing(Book::getName)
.thenComparing(Book::getAuthor))
.thenComparingInt(Book::getId));
Ответ 5
с java 8 с использованием ссылочного метода
вы можете добавить метод compare
в класс Book
class Book {
public static int compare(Book a , Book b)
{
return a.name.compareTo(b.name);
}
}
а затем вы можете сделать это:
Arrays.sort(books , Book::compare);
здесь приведен полный пример:
static class Book {
String name;
String author;
public Book(String name, String author) {
this.name = name;
this.author = author;
}
public static int compareBooks(Book a , Book b)
{
return a.name.compareTo(b.name);
}
@Override
public String toString() {
return "name : " + name + "\t" + "author : " + author;
}
}
public static void main(String[] args) {
Book[] books = {
new Book("Book 3" , "Author 1"),
new Book("Book 2" , "Author 2"),
new Book("Book 1" , "Author 3"),
new Book("Book 4" , "Author 4")
};
Arrays.sort(books , Book::compareBooks);
Arrays.asList(books).forEach(System.out::println);
}
Ответ 6
Иногда вы хотите отсортировать массив объектов на произвольном значении. Поскольку compareTo() всегда использует ту же информацию о экземпляре, вы можете использовать другую технику. Один из способов - использовать стандартный алгоритм сортировки. Скажем, у вас есть массив книг, и вы хотите отсортировать их по высоте, который хранится как int и доступен через метод getHeight(). Здесь вы можете сортировать книги в своем массиве. (Если вы не хотите менять исходный массив, просто сделайте копию и выполните сортировку.)
`int tallest; // the index of tallest book found thus far
Book temp; // used in the swap
for(int a = 0; a < booksArray.length - 1; a++) {
tallest = a; // reset tallest to current index
// start inner loop at next index
for(int b = a + 1; b < booksArray.length; b++)
// check if the book at this index is taller than the
// tallest found thus far
if(booksArray[b].getHeight() > booksArray[tallest].getHeight())
tallest = b;
// once inner loop is complete, swap the tallest book found with
// the one at the current index of the outer loop
temp = booksArray[a];
booksArray[a] = booksArray[tallest];
booksArray[tallest] = temp;
}`
Когда этот код будет выполнен, массив объекта Book будет отсортирован по высоте в порядке убывания - мечта дизайнера интерьера!
Ответ 7
Вы можете реализовать интерфейс "Comparable" для класса, чьи объекты вы хотите сравнить.
А также реализовать метод "CompareTo" в этом.
Добавьте экземпляры класса в ArrayList
Тогда метод "java.utils.Collections.sort()" сделает необходимую магию.
Вот "s---> (https://deva-codes.herokuapp.com/CompareOnTwoKeys) рабочий пример, в котором объекты сортируются по двум ключам сначала по идентификатору, а затем по имени.
Ответ 8
Arrays.sort(yourList,new Comparator<YourObject>() {
@Override
public int compare(YourObjecto1, YourObjecto2) {
return compare(o1.getYourColumn(), o2.getYourColumn());
}
});
Ответ 9
public class Student implements Comparable<Student> {
private int sid;
private String sname;
public Student(int sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + "]";
}
public int compareTo(Student o) {
if (this.getSname().compareTo(o.getSname()) > 1) {
return toString().compareTo(o.getSname());
} else if (this.getSname().compareTo(o.getSname()) < 1) {
return toString().compareTo(o.getSname());
}
return 0;
}
}
Ответ 10
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
List<Student> str = new ArrayList<Student>();
str.add(new Student(101, "aaa"));
str.add(new Student(104, "bbb"));
str.add(new Student(103, "ccc"));
str.add(new Student(105, "ddd"));
str.add(new Student(104, "eee"));
str.add(new Student(102, "fff"));
Collections.sort(str);
for(Student student : str) {
System.out.println(student);
}
}
}