Java - Collections.sort()的问题

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的新手,并且在发布时相当新,所以我仍然习惯于在两种情况下如何完成工作,所以如果你对我很轻松,我会很感激.谢谢!

Flo*_*ryn 5

您的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,反之亦然.