2015-09-03 1 views
0

donc je dois trier un ensemble (de préférence un TreeSet) des articles de la catégorie « article »:Tri un ensemble d'objets selfmade à un ArrayList (Java)

public abstract class Article { 
    String title; 
    String articleNumber; 

    public Article(String title, String articleNumber) { 
     this.title = title; 
     this.articleNumber = articleNumber; 
    } 

    public String getArticleNumber() { 
     return this.articleNumber; 
    } 
} 

public class Book extends Article { 
    String author; 

    public Book(String author, String title, String articleNumber) { 
     super(title, articleNumber); 
     this.author = author; 
    } 
} 

public class Song extends Article { 
    String interpret; 

    public Song(String interpret, String title, String articleNumber) { 
     super(title, articleNumber); 
     this.interpret = interpret; 
    } 
} 

article est une classe imbriquée de OnlineShop qui contient l'ensemble d'articles original. J'ai implémenté les méthodes pour ajouter et supprimer des arcs, mais j'ai encore besoin d'une méthode pour trier les articles de l'ensemble: Set<Article> availableArticles = new TreeSet<Article>(); en fonction de la valeur articleNumber dans une ArrayList. J'ai essayé cela, mais il semble ne pas fonctionner: où est DECLASSES une liste des articles, mais pas les valeurs de chaîne (comment puis-je extraire ce?)

Collections.sort(unSorted, new Comparator<Article>() { 
     @Override 
     public int compare(Article a, Article b) { 
      return a.getArticleNumber().compareTo(b.getArticleNumber()); 
     } 
    }); 
} 
+0

Vous parlez d'un (arbre) et mis availableArticles sur une liste non triés. Comment vont-ils ensemble? Que voulez-vous atteindre à la fin un ensemble trié ou une liste triée? Si vous voulez un ensemble trié, placez le comparateur sur l'ensemble de l'arbre, puis ajoutez les éléments que vous voulez dans cet ensemble. – Bogdan

+0

Que signifie "ça ne marche pas"? Ne pas trier correctement, échoue-t-il à compiler? Aussi, où est la méthode de tri? –

Répondre

0

Je pense que votre atempt était pas mal. Je suppose que votre numéro d'article est au format "1234". Bien que ce soit un objet String, ce qui veut dire que si vous voulez le trier en comparant ses nombres, vous devez analyser les Strings en un int. Sinon, votre comparateur interprète vos chiffres comme des caractères basés sur les octets, ce qui crée un désordre.

La solution non testé, si mon hypothèse est correcte, ressemble à:

Collections.sort(unSorted, new Comparator<Article>() { 
      @Override 
      public int compare(Article a, Article b) { 
       return Integer.compare(Integer.parseInt(a.getArticleNumber()),Integer.parseInt(b.getArticleNumber())); 
      } 

à mon avis, il ressemble à un gâchis ... mieux faire:

Collections.sort(unSorted, new Comparator<Article>() { 
    @Override 
    public int compare(Article a, Article b) { 
     int articleNumberOne = Integer.parseInt(a.getArticleNumber()); 
     int articleNumberTwo = Integer.parseInt(b.getArticleNumber()); 

     return Integer.compare(articleNumberOne, articleNumberTwo); 
       } 
      } 

grâce à Holger pour son conseil: D

+0

Il n'y a pas de membre 'getValue' dans la classe' String'. – Holger

+0

désolé je n'étais pas dans mon esprit: P je l'ai édité juste maintenant –

+1

Vous ne pouvez pas invoquer une méthode comme 'compareTo' sur le type primitif' int'. Vous pouvez utiliser la méthode 'static':' return Integer.compare (articleNumberOne, articleNumberTwo); ' – Holger

0

Merci à tous pour votre contribution, j'ai réalisé ce que je voulais avec cette méthode:

public ArrayList<Article> sortByArticleNumber() { 
    if (availableArticles.isEmpty()) { 
     System.out.println("No Articles available"); 
     return new ArrayList<Article>(); 
    } 

    ArrayList<Article> articles= new ArrayList<Article>(availableArticles); 

    // sort Methode wird überschrieben für ArrayList<Article> articles 
    Collections.sort(articles, new Comparator<Article>() { 
     @Override 
     public int compare(Article a, Article b) { 

      int a1 = Integer.parseInt(a.getArticleNumber()); 
      int b1 = Integer.parseInt(b.getArticleNumber()); 

      return Integer.compare(a1, b1); 

     } 
    }); 
    System.out.println(articles.toString()); 
    return articles; 
} 

public static void main(String args[]) { 

    try { 

     OnlineShop myShop = new OnlineShop(); 
     //Set<Article> availableArticles = new TreeSet<Article>(); 
     //availableArticles.add(myShop.new Article ("Dell", "1234567"){}); 
     //availableArticles.add(myShop.new Article ("Alienware", "987654"){});  
     myShop.addArticle(myShop.new Article ("Dell", "9999"){}); 
     myShop.addArticle(myShop.new Article ("Asio", "9888"){}); 
     myShop.addArticle(myShop.new Article ("Alienware", "9001"){}); 
     myShop.addArticle(myShop.new Song ("SSIO", "Bonn17", "5346")); 
     myShop.sortByArticleNumber(); 
    } 
    catch (Throwable ex) { 
     System.err.println("Uncaught exception - " + ex.getMessage()); 
     ex.printStackTrace(System.err); 
    } 
} 

Le résultat est:

[Song [interpret=SSIO, title=Bonn17, articleNumber=5346] 
, Article [title=Alienware, articleNumber=9001] 
, Article [title=Asio, articleNumber=9888] 
, Article [title=Dell, articleNumber=9999] 
]