将一组自制对象排序到 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]
]
所以我必须从 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]
]