请解释sort()和compareTo()

时间:2016-04-22 03:47:43

标签: java

我正在编写一个比较Twitter推文的代码。

Tweet构造函数(Tweet类已实现Comparable)(在Tweet.java中声明):

   public Treet(String author, String description, Date creationDate) {  
   mAuthor = author;
   mDescription = description;
   mCreationDate = creationDate;

  }

说我想比较两条推文(在Example.java中声明):

   Tweet tweetOne = new Tweet("Hello reddit", "josh", new Date(18909042L);
   Tweet tweetTwo = new Tweet("Hello again reddit", "Susan", new Date (19419249L);

然后我用这两条推文创建了一个数组(在Example.java中声明)

  Tweet[] tweets = {tweetOne, tweetTwo]

然后排序(在Example.java中声明)

  Arrays.sort(tweets);

这是我的覆盖compareTo()(在Tweet.java中声明)

  public int compareTo(Object obj) {

 Treet other = (Treet) obj;

 if (equals(other)) {

  return 0;
}

int dateCmp = mCreationDate.compareTo(other.mCreationDate);

if (dateCmp == 0) {

  return mDescription.compareTo(other.mDescription);

}

return dateCmp;
}

有些事情真让我头疼我的桌子:

1)sortTo()如何调用compareTo()方法(如果有的话)?

2)如果no1为真,那么为什么它是compareTo(Object obj)而不是compareTo(Tweet twt);看到推文是Tweet类的数组?大概是:

 Array.sort(tweets) -----> compareTo(tweets) ?

3)if(equals(other))什么等于什么?有人告诉我,它是if(this.euqals(其他)​​)但又是什么呢?是吗

   tweetOne.equals(other) or tweetTwo.equals(other) or Tweet.equals(other)?

4)mDescription.compareTo(other.mDescription),如果

,这里的mDescription是什么呢?
  (other.mDescription) == ({tweetOne, tweetTwo}.mDescription)? 

如果我这样做:

int val = mDescription.compareTo(other.mDescription)

val会是什么?

我对compareTo()方法中发生的事情感到特别困惑,因为我们想比较tweetOne AGAINST tweetTwo,但没有证据表明这种情况发生了。

我希望有人可以指导我,这对我来说是一个巨大的障碍。

非常感谢你。

2 个答案:

答案 0 :(得分:0)

compareTo方法检查以下内容。

  • 如果anObject< anotherObject
  • 如果anObject等于anotherObject
  • ,则为零
  • 如果anObject>为正整数anotherObject

所以在你的情况下,

int dateCmp = mCreationDate.compareTo(other.mCreationDate);
    if (dateCmp == 0) {
        return mDescription.compareTo(other.mDescription);
}

 return dateCmp;
}

这是怎么回事,

  • 首先检查日期,如果日期相同,则比较说明。
  • 将根据说明对推文进行比较。

本文肯定有助于http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-1/

答案 1 :(得分:0)

Java提供了两种类似的机制,用于比较两个实例以进行排序; Comparable.compareTo(T)Comparator.compare(T, T)。两者都提供three-way comparison(来自链接的维基百科条目)

  

许多面向对象的语言都有一个三向比较方法,它在对象和另一个给定对象之间执行三向比较。例如,在Java中,任何实现Comparable接口的类都有一个compareTo方法,它返回一个负整数,零或一个正整数。

有关如何在实践中发挥作用的示例,请考虑使用通用selectionSort

static <T extends Comparable<? super T>> void selectionSort(T[] arr) {
    int index = 0, i = 0, length = (arr != null) ? arr.length : 0, j;
    for (; i < length - 1; index = ++i) {
        for (j = i + 1; j < length; ++j) {
            if (arr[j].compareTo(arr[index]) < 0) {
                index = j; // <-- here we update the index when we find a smaller value
            }
        }
        if (i != index) { // <-- if i == index then it is in the correct position
            swap(arr, i, index);
        }
    }
}

注意我们也可以使用Comparator;

进行操作
static <T> void selectionSort(T[] arr, Comparator<T> comp) {
    int index = 0, i = 0, length = (arr != null) ? arr.length : 0, j;
    for (; i < length - 1; index = ++i) {
        for (j = i + 1; j < length; ++j) {
            if (comp.compare(arr[j], arr[index]) < 0) {
                index = j;
            }
        }
        if (i != index) {
            swap(arr, i, index);
        }
    }
}