Tra*_*ton 0 java sorting collections arraylist tostring
我目前正在编写一个打印图书列表的程序.书籍元素的每个ArrayList由一个字符串(一本书的标题)和一个ArrayList(该书的作者)组成.我需要对书籍的ArrayList进行排序,使它们按字母顺序排列(按标题排序).我的问题是,当我打印新的ArrayList(我称之为Collections.sort()的列表)时,我得到的输出与我第一次打印非排序版本时的输出相同.
我myLib.sort();从我的驱动程序调用,该程序在我的Library类中转到此方法:
public void sort()
{
Collections.sort(myBooks);
}
Run Code Online (Sandbox Code Playgroud)
myBooks是我之前提到的书籍的ArrayList.根据我的阅读,Collections.sort("ArrayList name")应按字母顺序排列我的列表.如果这是不正确的,我需要使用compareTo()和equals()方法,那么这些class Book是我用于构建进入我的书籍的那些方法class Library:
public int compareTo(final Book theOther)
{
int result = 0;
if (myTitle.equals(theOther.myTitle))
{
if (myAuthors.get(0) != theOther.myAuthors.get(0))
{
result = 1;
}
}
else
{
result = 0;
}
return result;
}
public boolean equals(final Object theOther)
{
if (theOther instanceof String)
{
String other = (String) theOther;
return myTitle == other;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一剩下的可能问题是我的打印方法.我的驱动程序打印出myLib哪个库.我的库类有以下toString()方法:
public String toString()
{
String result = "";
for (int i = 0; i < myBooks.size(); i++)
{
String tempTitle = myBooks.get(i).getTitle();
ArrayList<String> tempAuthors = myBooks.get(i).getAuthors();
Book tempBook = new Book(tempTitle, tempAuthors);
result += (tempBook + "\n");
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这将从我的Book类toString()方法中获取每本书和该书的字符串,如下所示:
public String toString()
{
return "\"" + myTitle + ",\" by " + myAuthors;
}
Run Code Online (Sandbox Code Playgroud)
如果这太小,太多,太混乱,不够清楚等等......请在评论中告诉我,我会尽快编辑这篇文章.如果需要,我也可以发布我的三个课程的全部内容.我是Java的新手,并且在发布时相当新,所以我仍然习惯于在两种情况下如何完成工作,所以如果你对我很轻松,我会很感激.谢谢!
您的compareTo()方法似乎是错误的,请注意Collections.sort()使用该方法来比较列表中的对象.
你只检查标题是否等于,如果是,那么你比较第一作者,如果它们相等,你返回1,否则你返回0;
compareTo()用于检查此对象是否小于,等于或大于您要比较的对象(返回0表示等于,负数表示较小,正数表示较大,您返回正数0).我建议你阅读compareTo()方法的javadoc .
作为一个例子,这里是一个Book类的实现,我只根据标题进行比较(我省略了作者列表的比较).
public class Book implements Comparable<Book> {
private String title;
private List<String> authors;
public Book(String title) {
this.title = title;
}
public int compareTo(Book o) {
return this.title.compareTo(o.title);
}
@Override
public boolean equals(Object b){
if(!(b instanceof Book)){
return false;
}
//authors comparison omitted
return this.title.equals(((Book) b).title);
}
@Override
public String toString(){
return "Title: "+ title; //todo: add authors also if need
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在Book.compareTo()方法中看到的,我依赖于String.compareTo().它将返回-1,0或1; 如果您需要根据作者列表进行比较,您还必须了解该方法的逻辑并考虑一些问题:
另请注意:compareTo应该与equalscompare 一致,如果compareTo返回0,那么equals应该返回true,反之亦然.
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |