2017-09-09 8 views
0

J'essaie de trier une ArrayList remplie d'objets clients.Objet ArrayList insertionsort

ArrayList Cust = new ArrayList(); 
Cust.add(new Customer("John",15,"New York",200)); 
Cust.add(new Customer("Moya",25,"Randfontein",200));       
Cust.add(new Customer("Sue",44,"Jersey",100)); 
Cust.add(new Customer("Mpho",23,"London",250)); 

J'ai une classe étrangère, Trier qui contient une méthode de tri d'insertion qui implémente l'interface Comparable.

public static <AnyType extends Comparable<? super AnyType>> void insertionSort(ArrayList<AnyType> a) { 
     for (int p = 1; p < a.size(); p++) { 
      AnyType tmp = a.get(p); 
      int j; 

      for (j = p; j > 0 && tmp.compareTo(a.get(j - 1)) < 0; j--) { 
       a.set(j, a.get(j - 1)); 
      } 
      a.set(j, tmp); 
     } 

J'ai essayé d'utiliser cette méthode dans la classe principale pour trier les ArrayList en fonction de l'âge du client (deuxième élément).

Sorting.insertionSort(CustList); 

Cela me donne une erreur si: aucune méthode appropriée trouvée pour InsertionSort (java.util.ArrayList) Sorting.insertionSort (CustList);

Aidez-moi _ (ツ) _/¯

comme demandé, voici le code complet:

public interface Comparator<AnyType> { 
     /** 
     * Return the result of comparing lhs and rhs. 
     * @param lhs first object. 
     * @param rhs second object. 
     * @return < 0 if lhs is less than rhs, 
     *   0 if lhs is equal to rhs, 
     *   > 0 if lhs is greater than rhs. 
     */ 
     int compare(AnyType lhs, AnyType rhs); 
    } 
/// 

    public final class Customer implements Comparable<Customer> { 

     String name; 
     int age; 
     String city; 
     int loyaltyPoints; 

     public Customer(String n, int a, String c, int lP) { 
      name=n; age=a; city=c; loyaltyPoints=lP; 
     } 

     public String toString() { 
      return "Customer " + name + " from " + city + " is " + age + " years old, and has loyaltypoints of " + loyaltyPoints; 
     } 

     public int compareTo(Customer rhs) { 
      return this.age - rhs.age; 
     } 
    } 
/// 
    public final class Sorting { 


     public static <AnyType> void insertionSort(ArrayList<AnyType> a, Comparator<? super AnyType> cmp) { 

     } 



     public static <AnyType extends Comparable<? super AnyType>> void insertionSort(ArrayList<AnyType> a) { 
      for (int p = 1; p < a.size(); p++) { 
       AnyType tmp = a.get(p); 
       int j; 

       for (j = p; j > 0 && tmp.compareTo(a.get(j - 1)) < 0; j--) { 
        a.set(j, a.get(j - 1)); 
       } 
       a.set(j, tmp); 
      } 
     } 
    } 

/// 
public class Test{ 

    public static void main(String[] args) { 

     // Add some customers to an arraylist 
     ArrayList Cust = new ArrayList(); 
     Cust.add(new Customer("John",45,"Tokyo",200)); 
     Cust.add(new Customer("Johna",25,"London",200));       
     Cust.add(new Customer("James",33,"New York",100)); 
     Cust.add(new Customer("Jack",23,"Utah",250));       
     Cust.add(new Customer("Janet",25,"Jersey",250));  
     Cust.add(new Customer("Jared",28,"Gotham",250)); 

     Sorting.insertionSort(Cust); 

    } 
} 
+0

De quelle version de Java êtes-vous? Parce que le code que vous avez fourni fonctionne pour 1.8? Bien qu'il puisse y avoir beaucoup d'améliorations, mais en ce qui concerne le tri, son fonctionnement. –

Répondre

2

Utilisez ArrayList<Customer> custList = new ArrayList<>(); et assurez-vous que 'client' met en œuvre COMPARABLE.

Le problème avec ArrayList Cust est que Java ne peut pas assumer quoi que ce soit sur le type des éléments de la liste, sauf qu'ils sont Object, qui n'est pas Comparable.

Mise à jour:

  1. Votre code comme affiché doit compiler et exécuter, mais Cust.add(...) devrait soulever un avertissement « d'appel non contrôlé à « ajouter (E) » en tant que membre de ArrayList de type brut »
  2. Pour fixer l'avertissement, remplacez la ligne par ArrayList Cust = new ArrayList<>();ArrayList<Customer> Cust = new ArrayList<>();

Quelques autres notes:

  1. Normalement, vos méthodes doivent attendre des interfaces au lieu de classes concrètes, afin de mieux vous remplacer la signature de la méthode public static <AnyType extends Comparable<? super AnyType>> void insertionSort(ArrayList<AnyType> a) avec public static <AnyType extends Comparable<AnyType>> void insertionSort(List<AnyType> a) - note qu'il attend « List » au lieu de « ArrayList »
  2. des noms de variables en début java avec les minuscules, c'est-à-dire 'cust' au lieu de 'Cust'.
+1

Il ajouterait plus de valeur pour les autres utilisateurs si vous expliquez "pourquoi" le code OP ne fonctionne pas plutôt qu'un bref commentaire sur la façon de résoudre ce problème. En outre, je ne suis pas sur un ordinateur pour tester cela, mais ArrayList n'est pas obligatoire? ArrayList devrait être très bien? – CKing

+0

a ajouté quelque chose – Alexander

+0

Downvote rétracté. – CKing