我正在编写一个比较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,但没有证据表明这种情况发生了。
我希望有人可以指导我,这对我来说是一个巨大的障碍。
非常感谢你。
答案 0 :(得分:0)
compareTo方法检查以下内容。
所以在你的情况下,
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);
}
}
}