public class Product implements Serializable{
private String id;
private String name;
private double price ;
private int quantity;
public Product(String id, String name, double price, int quantity) {
this.id = id;
this.name = name;
this.price = price;
this.quantity = quantity;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public String toString() {
return "Product{" + "id=" + id + ", name=" + name + ", price=" + price + ", quantity=" + quantity + '}';
}
I want to sort ArrayList<Product> by price and name. I search Google for a long time but I cann't solve it. Whether it can have problem with Serializable
5 Réponses :
Vous devez implémenter Vous pouvez apprendre la différence entre ces deux en lisant ces tutoriels P> Considérez que vos produits doivent être triés à l'aide de son prix, apportez votre mais maintenez-le sur ... Maintenant que nous avons déjà mis en œuvre Supposons que nous voulions trier à l'aide de son prix, puis: p> comparable code> comparable code> interface pour votre but. Tri des objets définis par l'utilisateur avec comparateur a > et Tri des objets définis par l'utilisateur avec comparable Produit Code> Implémente Comparable code> comme suit p> interface code> comparable pour trier les objets en utilisant son Prix, comment pouvons-nous les trier à l'aide d'une autre séquence de tri? Nous n'avons qu'un comparèteo () code> et nous ne pouvons pas écrire une séquence de tri distincte dans la même classe. Voici le rôle du comparateur code>. Avec comparateur code>, vous pouvez définir plusieurs séquences de tri. P> Collections.sort(yourList, new NameSorter());
Vous voulez dire comparable code>
@morgano, les deux peuvent résoudre le but. comparateur code> présente certains avantages sur comparable code>
Dans ce cas particulier, il doit être implanté, c'est comparable code>. Vous implémentez comparateur code> si votre objet va comparer entre les objets, non si votre objet sera comparé.
@Morgano, il n'est pas possible si l'utilisateur n'est pas autorisé à modifier le code de produit code>. Utilisation de comparateur code>, il n'a rien à changer dans produit code>. Eh bien, vous pouvez utiliser une classe anonyme pour cela. Mais si nous voulons créer plusieurs séquences de tri, le comparateur est un must.
Une question et je peux être désactivée ici, mais la primitive double code> n'a pas de méthode code>. Étant donné que getPrice code> renvoie la primitive, est un peu d'autoboxage qui permet d'utiliser comparèteo code>?
J'essaie les prix correspondant. Mais cela montre un avertissement: double ne peut pas être interrogé sur b>
Cela aurait pu être en raison du problème @kevinbowersox a souligné. J'ai édité la réponse en conséquence. Ça marche
La première partie de votre code est fausse. Je ne vois pas un b>. Donc, il ne peut pas être un.getprice () b>
@haind, je suis désolé d'avoir mal placé le code. J'aurais dû le mettre en prix. J'ai édité en conséquence
@Kharkar ouais! Merci pour votre aide.Ils très sympa.Mon, ça marche pour moi
@haind, je suis content de pouvoir aider
Wow, cela résout mon problème, très rapide et soigné, merci pour cela.
Vous devez implémenter l'interface Sinon, vous pouvez faire ce que @prasad Kharkar a suggéré et écrire un http://docs.oracle.com/ Javase / 7 / Docs / API / Java / Lang / comparable.html P>
http://www.mkyong.com / Java / Java-Object-Exemple de tri-objet-comparable / comparable / P> comparable code> comparable. L'interface nécessite que vous ajoutez une fonction appelée comparèteo (produit autre) code> dans lequel vous écrivez le code qui vérifie les champs personnalisés que vous souhaitez que les objets soient comparés. P>
Comaparator code> qui fait essentiellement la même chose. P>
Autant que je sache, vous n'avez pas de telles méthodes, ce que vous pouvez faire est; Étendez une sous-classe de collecte et ajoutez des méthodes pour trier (recherche ou techniques telles que Bubble Trit, et plus encore) P>
Si vous avez une installation pour une base de données (plus de frais généraux) * Vous pouvez le mettre là-bas et utiliser la commande par * Si vous utilisez JPA, videz simplement votre liste dans une classe d'entité p>
Utiliser un comparateur Collections.sort(list, Comparator.comparing(Product::getPrice).thenComparing(Product::getName));
Plus tôt a travaillé pour moi. Pas besoin de voir la mise à jour mais pour 8, il semble bon
avoir le le produit code> de la classe Implémentez l'interface comparable code> comparable. import java.io.Serializable;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Product implements Serializable, Comparable<Product> {
private String id;
private String name;
private double price;
private int quantity;
public Product(String id, String name, double price, int quantity) {
this.id = id;
this.name = name;
this.price = price;
this.quantity = quantity;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public String toString() {
return "Product{" + "id=" + id + ", name=" + name + ", price=" + price
+ ", quantity=" + quantity + '}';
}
@Override
public int compareTo(Product o) {
int result = this.name.compareToIgnoreCase(o.name);
if(result != 0){
return result;
}else{
return new Double(this.price).compareTo(new Double(o.price));
}
}
public static void main(String[] args) {
Product p1 = new Product("p1", "shoes", 30.33, 20);
Product p2 = new Product("p2", "shoes", 20.30, 20);
Product p3 = new Product("p3", "shoes", 50.33, 20);
Product p4 = new Product("p4", "socks", 10.50, 20);
Product p5 = new Product("p5", "socks", 5.40, 20);
Product p6 = new Product("p6", "socks", 2.34, 20);
List<Product> products = Arrays.asList(p1,p2,p3,p4,p5,p6);
System.out.println("Unsorted");
for(Product product:products){
System.out.println("Product: " + product.name + " Price: " + product.price);
}
Collections.sort(products);
System.out.println("sorted");
for(Product product:products){
System.out.println("Product: " + product.name + " Price: " + product.price);
}
}
}
@haind Avez-vous reçu un message d'erreur? Ou était le genre non pas comme prévu? Si oui, comment avez-vous pensé que le tri fonctionne?
Voici le résultat: 20.3 30.33 50.33 2.34 5.4 10.5
@HAIND C'était comme ça que j'ai interprété que vous vouliez la fonctionnalité. Il trie d'abord par le nom du produit, puis il trie par le prix, à la fois par ordre croissant. Je suppose que le résultat aurait dû contenir le nom du produit?
Ce n'est pas ce que je veux dire. Je veux trier par prix et nom pour chaque cas. Maintenant, je sais pourquoi il est 20.3 30.33 50.33 2.34 5.4 10.5
Prix Tout d'abord, puis Nom?
Comment avez-vous essayé de trier la liste
code>?1 cas avec nom, 1 cas avec prix. Pas les deux
Je ne me souviens pas. Certains d'entre eux utilisent des collections en classe, certains implémentons comparables