将一组自制对象排序到 ArrayList (Java)

Sorting a Set of selfmade objects to an ArrayList (Java)

所以我必须从 class "Article":

中对一组项目(最好是 TreeSet)进行排序
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;
    }
}

文章是 OnlineShop 的嵌套 class,其中包含原始文章集。 我已经实现了添加和删除文章的方法,但我仍然需要一种方法来对集合中的文章进行排序:Set<Article> availableArticles = new TreeSet<Article>(); 根据 ArrayList 中的 articleNumber 值。 我已经试过了,但它似乎不起作用:其中 unSorted 是一个文章列表,而不是字符串值(我如何提取它?)

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

我认为你的尝试没有错。我假设您的商品编号格式为“1234”。尽管它是一个 String 对象,这意味着如果你想比较它的数字对其进行排序,你必须将 Strings 解析为一个 int。否则,您的比较器会将您的数字解释为基于字节的字符——这会造成混乱。

未经测试的解决方案,如果我的假设是正确的,看起来像:

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

在我看来它看起来一团糟...最好这样做:

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

感谢 Holger 的建议 :D

谢谢大家的意见,我用这个方法达到了我想要的效果:

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

结果是:

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