2016-11-12 2 views
2

J'ai deux classes:Collections comparateur tri personnalisé

public class Invoice { 

private int InvoiceId; 
private Customer customer; 
private Date invoiceDate; 

}

Et

public class Customer { 
    private int customerId; 
    private String customerType; 
} 

champ CustomerType peut avoir trois valeurs: F, H, B

Je une arrayList d'objets de facture, je veux le trier en utilisant la propriété customerType dans un ordre spécifique: toute la facture avec cu stomerType "F" puis ceux avec "H" puis "B".

J'ai essayé d'implémenter l'interface Comparateur, mais le problème est que sa méthode de comparaison prend deux arguments d'objets Client et que le tri est effectué de manière ascendante ou descendante. Voici le code:

Collections sort(invoicesList, new Comparator<Invoice >() { 
       public int compare(Invoice s1,Invoice s2) { 
         return s1.getCustomer().getCustomerTpe().equalsIgnoreCase("F").compareTo(s2.getCustomer().getCustomerTpe().equalsIgnoreCase("H")) 

         } 
        } 
    ); 

est-il un moyen de trier ma collection avec un ordre spécifique avec trois fileds valeur? Thnks

Répondre

2

Une façon de personnaliser l'ordre de tri consiste à mapper d'abord les arguments, puis à trier les valeurs mappées. Dans votre cas, le mapping du customerType peut être fait en trouvant son index dans la chaîne "FHB". En Java 8, cela pourrait être exprimé comme

Collections.sort(invoicesList, Comparator.comparingInt(
    (invoice) -> "FHB".indexOf(invoice.getCustomer().getCustomerType()))); 
+1

J'utilise java 6, je vais essayer de l'implémenter avec ma version de java. Merci – Alex2330