Tengo una clase, Biblioteca, que contiene una matriz de objetos Libro, y necesito ordenar la matriz en función de las propiedades de Libro, ya sea Título o Número de página. El problema es que no puedo usar la clase Comparable con Libro. ¿Cómo recomendarías que ordenara la matriz de Libros en la biblioteca? Escribir mi propio tipo? ¿O hay una forma más fácil? Si necesita fragmentos de código, ¡solo pregunte!Clasificación Java: ordenar una matriz de objetos por propiedad, no se permite el objeto Comparable
Clasificación Java: ordenar una matriz de objetos por propiedad, no se permite el objeto Comparable
Respuesta
Puede proporcionar un Comparator
para comparar cualquier tipo que desee, Comparable
o de lo contrario.
para Arrays y Colecciones utiliza
Arrays.sort(array, myComparator);
Collections.sort(list, myComparator);
colecciones Incluso clasificadas como TreeSet puede tomar un Comparador de encargo
por ejemplo,
Collections.sort(books, new Comparator<Book>() {
public int compare(Book b1, Book b2) {
return if b1 is greater return +1, if b2 is smaller return -1 otherwise 0
}
});
Bien, ¿me pueden ayudar con una implementación básica? Soy bastante nuevo en Java, así que declaro Biblioteca con clase pública ¿La biblioteca implementa Comparable
Un comparador es una clase independiente que es adicional a su clase. Hay muchas maneras en que puede hacerlo, pero una opción común es usar una clase anónima, agregó un ejemplo. –
Muy bien, veo lo básico de esto, lo último sería dónde implementar esto en mi código, como decir que tenía una función en Library public void sort() {} ¿Sería allí donde arrojaría este código? Y luego para ordenarlo, usaría Arrays.sort (arrayname,?) – samuraiseoul
palillo de esto en su Biblioteca:
java.util.Collections.sort(bookList, bookComparator);
lista de libros sería el nombre de la matriz, ¿verdad? ¿Qué pasa con bookComparator? – samuraiseoul
bookComparator será una instancia de implementación de la interfaz Comparator que tiene en cuenta las propiedades específicas del libro (por ejemplo, título, ISBN, etc.). En este ejemplo, bookList es una lista que es fácil de obtener de una matriz pero puede adherirse a la matriz y hacer: Arrays.sort (bookArray, bookComparator); –
Si puede utilizar Comparators
, escribir uno para cada tipo de ordenación que necesita, por ejemplo, ascendiendo por título del libro y descendente de número de página. El método compare
de Comparator
debe devolver positivo si el primer argumento es más grande que el segundo, negativo si el primero es más pequeño y cero si son iguales.
import java.util.Comparator;
import java.util.List;
import java.util.Arrays;
class Book{
String title;
int pageNumber;
public Book(String title, int pageNumber){
this.title = title;
this.pageNumber = pageNumber;
}
String getTitle(){ return title; }
int getPageNumber(){ return pageNumber; }
public String toString(){
return "(" + title + ", " + pageNumber + " pages)";
}
}
public class Library{
// These variables are static because you don't need multiple copies
// for sorting, as they have no intrinsic state.
static private Comparator<Book> ascTitle;
static private Comparator<Book> descPageNumber;
// We initialize static variables inside a static block.
static {
ascTitle = new Comparator<Book>(){
@Override
public int compare(Book b1, Book b2){
return b1.getTitle().compareTo(b2.getTitle());
}
};
descPageNumber = new Comparator<Book>(){
@Override
public int compare(Book b1, Book b2){
// Java 7 has an Integer#compare function
return Integer.compare(b1.getPageNumber(), b2.getPageNumber());
// For Java < 7, use
// Integer.valueOf(n1).compareTo(n2);
// DO NOT subtract numbers to make a comparison such as n2 - n1.
// This can cause a negative overflow if the difference is larger
// than Integer.MAX_VALUE (e.g., n1 = 2^31 and n2 = -2^31)
}
};
}
private Book[] books;
public Book[] getBooks(){ return books; }
public void sortAscTitle(){
Arrays.sort(books, ascTitle);
}
public void sortDescPageNumber(){
Arrays.sort(books, descPageNumber);
}
public Library(Book[] books){
this.books = books;
}
public static void main(String[] args){
Library library = new Library(new Book[]{
new Book("1984", 123),
new Book("I, Robot", 152),
new Book("Harry Potter and the Philosopher's Stone", 267),
new Book("Harry Potter and the Goblet of Fire", 759),
new Book("The Bible", 1623)
});
library.sortAscTitle();
System.out.println(Arrays.toString(library.getBooks()));
library.sortDescPageNumber();
System.out.println(Arrays.toString(library.getBooks()));
}
}
¡Gracias! ¡Muy agradable! Estaba usando la sugerencia de Peter para eso, y ese estilo de implementación sale un poco mejor en mi clase, sin embargo, esto también es realmente bueno, y estaba teniendo problemas con los beneficios obtenidos, ¡así que ver ese código realmente me ayudó mucho! ¡Muchas gracias! Volveré a esta pregunta como referencia cada vez que necesite ordenar algo. – samuraiseoul
crean un nuevo treeMap y cambian los roles entre la clave y el valor.
TreeMap<Title ,Book> treeMap = new TreeMap<Title,Book>();
copiar todos los datos a la nueva TreeMap.
Ahora tiene una colección ordenada basada en el Título. (Y no Comparador requiere :))
-1 Lovely hack que tienes aquí. Incluso esto es inteligente, no vale la pena crear dos nuevas instancias de TreeMap para simplemente ordenar una matriz. Sin mencionar el hecho de que al mirar tu código uno no tiene idea de qué hace. – mykolaj
Ampliación @ respuesta de PeterLawrey a Java 8, ahora se puede utilizar un Lambda Expression en lugar de un delegado Comparable<T>
:
Collections.sort(books, (firstBook, secondBook -> b1 is greater return +1,
if b2 is smaller return -1 otherwise 0));
- 1. PHP Función de clasificación para ordenar una matriz de objetos
- 2. Ordenar NSMutableArray Por propiedad del objeto
- 3. Mongodb: ordenar documentos por objetos de matriz
- 4. Javascript lista de objetos de la clasificación por objeto la propiedad
- 5. Javascript en IE8: cómo ordenar una matriz de objetos por propiedad alfanumérica
- 6. Ordenado una matriz de objetos javascript por una propiedad de objeto
- 7. Ordenar un array de objetos EmberJS por la propiedad
- 8. Genéricos y clasificación en Java
- 9. Ordenar una colección de objetos
- 10. ¿Cómo ordenar una matriz de objetos por un atributo de los objetos?
- 11. ¿Ordenar una matriz de objetos en Ruby por atributo de objeto?
- 12. PHP - Entrada por la propiedad objeto de una matriz de objetos
- 13. ¿Cómo se ordena una matriz de objetos?
- 14. ¿Por qué no se permite en Java sobrecargar Foo (Objeto ...) con Foo (Objeto [])?
- 15. En Java, ¿cómo se recoge una matriz de objetos basura?
- 16. Ordenar una matriz por el valor de una matriz secundaria en PHP
- 17. ¿Cómo ordenar una matriz que contiene objetos de clase por un valor de propiedad de una instancia de clase?
- 18. Asegúrese de que los objetos implementen Comparable
- 19. Ordenar NSArray de objetos personalizados por sus propiedades NSDate
- 20. Ordenar lista de objetos por propiedades C#
- 21. PHP - Ordenar matriz multidimensional por otra matriz
- 22. Javascript - clasificar objetos en una matriz en orden alfabético en una propiedad de la matriz
- 23. Ordenar una matriz relacionada con otra matriz
- 24. ¿Cómo ordenar una lista de arrays de objetos java?
- 25. Clasificación Python - Una lista de objetos
- 26. ordenar por matriz numérica()
- 27. ¿Por qué no se permite System.out.println (super)?
- 28. ¿Cómo ordenar una matriz de entradas usando un comparador personalizado?
- 29. matriz multidimensional clasificación por cadena
- 30. Cómo ordenar una colección de objetos en JavaScript sin necesidad de convertirlo en una matriz
Y puede utilizar un 'Comparator'? –
Puedo en la biblioteca, pero no en el libro. – samuraiseoul
¿Es esta limitación artificial, como en una tarea, o hay otra razón? –