8
votes

Java Trier TRYAYLIST avec des champs personnalisés par numéro et alphabétiquement

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

4 commentaires

Prix ​​Tout d'abord, puis Nom?


Comment avez-vous essayé de trier la liste ?


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


5 Réponses :


28
votes

12 commentaires

Vous voulez dire comparable


@morgano, les deux peuvent résoudre le but. comparateur présente certains avantages sur comparable


Dans ce cas particulier, il doit être implanté, c'est comparable . Vous implémentez comparateur 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 . Utilisation de comparateur , il n'a rien à changer dans produit . 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 n'a pas de méthode . Étant donné que getPrice renvoie la primitive, est un peu d'autoboxage qui permet d'utiliser comparèteo ?


J'essaie les prix correspondant. Mais cela montre un avertissement: double ne peut pas être interrogé sur


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 . Donc, il ne peut pas être un.getprice ()


@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.



1
votes

Vous devez implémenter l'interface comparable comparable. L'interface nécessite que vous ajoutez une fonction appelée comparèteo (produit autre) dans lequel vous écrivez le code qui vérifie les champs personnalisés que vous souhaitez que les objets soient comparés.

Sinon, vous pouvez faire ce que @prasad Kharkar a suggéré et écrire un Comaparator qui fait essentiellement la même chose.

http://docs.oracle.com/ Javase / 7 / Docs / API / Java / Lang / comparable.html

http://www.mkyong.com / Java / Java-Object-Exemple de tri-objet-comparable / comparable /


0 commentaires

0
votes

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)

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é


0 commentaires

3
votes

Utiliser un comparateur code>, ici implémenté ici anonymement (approprié pour Java 7 et antérieur):

Collections.sort(list, Comparator.comparing(Product::getPrice).thenComparing(Product::getName));


1 commentaires

Plus tôt a travaillé pour moi. Pas besoin de voir la mise à jour mais pour 8, il semble bon



5
votes

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


4 commentaires

@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