web-dev-qa-db-fra.com

Comment trier un tableau d'objets en Java?

Mon tableau ne contient aucune chaîne. Mais sa contient des références d'objet. Chaque référence d'objet renvoie le nom, l'id, l'auteur et l'éditeur par la méthode toString.

public String toString() {
        return (name + "\n" + id + "\n" + author + "\n" + publisher + "\n");
}

Maintenant, je dois trier ce tableau d'objets par leur nom. Je sais comment trier, mais je ne sais pas comment extraire le nom des objets et les trier.

31
Tushar Monirul

Vous avez deux façons de le faire, utilisez la classe d'utilitaires Arrays

  1. Implémentez un comparateur et transmettez votre tableau avec le comparateur à la méthode sort qui le prend comme second paramètre.
  2. Implémentez l'interface Comparable dans la classe d'origine de vos objets et transmettez votre tableau à la méthode de tri qui prend un seul paramètre.

Exemple

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));
}

Sortie

[(bar, 2, author2, pub2), (foo, 1, author1, pub1)]
[(foo, 1, author1, pub1), (bar, 2, author2, pub2)]
31
A4L

Vous pouvez essayer quelque chose comme ça:

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);
  }
});
37
zbess

Java 8


Utilisation de expressions lambda

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");
    }
}

Sortie:

--- 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'}
]

Utiliser références de méthode

Arrays.sort(myTypes, MyType::compareThem);

compareThem doit être ajouté dans MyType.Java :

public static int compareThem(MyType a, MyType b) {
    return a.name.compareTo(b.name);
}
23
ROMANIA_engineer

Mise à jour pour Java 8 constructions

En supposant une classe Book avec un getter de champ name, vous pouvez utiliser Arrays.sort méthode en passant un Comparator supplémentaire spécifié avec Java 8 constructions - Méthode par défaut du comparateur) & références de méthode .

Arrays.sort(bookArray, Comparator.comparing(Book::getName));

De plus, il est possible de comparer plusieurs champs en utilisant les méthodes thenComparing.

Arrays.sort(bookArray, Comparator.comparing(Book::getName)
      .thenComparing(Book::getAuthor))
      .thenComparingInt(Book::getId));
7
shriyog

avec Java 8 en utilisant une méthode de référence

vous pouvez ajouter la méthode compare à votre classe Book

class Book {
     public static int compare(Book a , Book b)
     {
         return a.name.compareTo(b.name);
     }
}

et alors vous pourriez faire ceci:

Arrays.sort(books , Book::compare);

voici l'exemple complet:

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);

}
1
Ali

Vous pouvez implémenter l'interface "Comparable" sur une classe dont vous souhaitez comparer les objets.

Et implémentez également la méthode "compareTo" dans cela.

Ajouter les instances de la classe dans une ArrayList

Ensuite, la méthode "Java.utils.Collections.sort ()" fera le tour de magie nécessaire.

Voici ---> ( --- (https://deva-codes.herokuapp.com/CompareOnTwoKeys ) un exemple concret dans lequel les objets sont triés en fonction de deux clés, d'abord par leur identifiant, puis par leur nom.

0
Arrays.sort(yourList,new Comparator<YourObject>() {

    @Override
    public int compare(YourObjecto1, YourObjecto2) {
        return compare(o1.getYourColumn(), o2.getYourColumn());
    }
});
0
Mehmet Onar

Parfois, vous souhaitez trier un tableau d'objets sur une valeur arbitraire. Puisque compareTo () utilise toujours les mêmes informations sur l'instance, vous pouvez utiliser une technique différente. Une solution consiste à utiliser un algorithme de tri standard. Supposons que vous disposiez d'un tableau de livres et que vous souhaitiez les trier en fonction de leur hauteur, stockée sous la forme d'un int et accessible via la méthode getHeight (). Voici comment vous pouvez trier les livres de votre tableau. (Si vous ne souhaitez pas modifier le tableau d'origine, effectuez simplement une copie et triez-le.)

`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;
 }`

Lorsque ce code est terminé, le tableau d'objets Book sera trié par ordre décroissant selon la hauteur - le rêve d'un architecte d'intérieur!

0
Stephen Barner