1

我正在做一个编程任务,我可以使用一些帮助来理解 compareTo 方法。

作业的问题之一是将传入元素添加到列表中。如果列表已排序,我应该将新节点放在正确的位置。该列表可以按升序或降序排序。我想我可以通过将头节点与 (node.getNext()) 之后的节点进行比较来检查哪个是顺序,但我不确定。我不确定的代码行如下:

if(head.getContent().compareTo(tp.getContent())==1)

head 是第一个节点,是一个泛型数据类型 T,它已经被添加了。tp 是 head.getNext() 只是为了节省空间,也是一个通用数据类型 T,因为我确信我会再次输入它。我没有在程序上写 compareTo 方法,因为教授告诉我只需调用 compareTo 方法来比较另一种泛型数据类型。另外,我不确定以下之间的区别:

extends Comparable<T>

implements Comparable<T>

但任务要求我使用第一个。

如果头节点元素是 1,下一个是 3,if 语句的输出是什么?对或错?

4

7 回答 7

11

基本上考虑 compareTo 的方法是总是在它的另一边放一个零,然后想象运算符位于两个参数之间。

A.compareTo(B) == 0; // A == B
A.compareTo(B) > 0; // A > B
A.compareTo(B) >= 0; // A >= B

//etc etc etc

>-1这使您更容易阅读,并节省您在两年内试图弄清楚您的实际意思或某事的时间

于 2012-07-23T19:24:43.343 回答
1

要回答您问题的第二部分,Comparable<T>是一个定义单个方法的接口:compareTo().

  • 用于extends Comparable<T>创建向 Comparable 添加更多方法的子接口。

  • 用于实现接口implements Comparable<T>的具体类。

如果教授希望您使用,extends Comparable那么也许他希望您为节点创建一个接口,如下所示:

public interface Node<T> extends Comparable<Node<?>> {

    T getContent();
}
于 2012-07-23T19:29:52.573 回答
0

1.使用java.lang.Comparable 界面

public interface Comparable<T>{
    public int compareTo(){
    }
}

2.您的类需要实现 Comparable,然后每个元素将相互调用 compareTo() 对自己进行排序。

3.如果你想以一种以上的方式排序..然后使用java.util.Comparator, which usecompare()方法

于 2012-07-23T19:32:48.683 回答
0

Comparable 接口只是说您必须有一种方法来比较两个对象 A 和 B,两者都是 T 类型,并且正如 Affe 所指出的,如果 A > B,您应该返回 1,如果 A 和 B 相等,则返回 0,并且 - 1 如果 A < B。请注意,equal 并不意味着 ==,就像 Java 中的 == 表示“这两个对象引用是否引用同一事物”,而不是“这两个对象是否本质上相同”。

但是,它没有定义您必须如何比较它们。无论哪个类实现它都必须这样做。您可以根据类型 T 中某个字段的值说 A 大于 B,或者您可以做一些更复杂的事情。例如,由于较小的整数值表示较高的优先级(1 < 2,但优先级一的问题高于优先级二的问题),因此比较的基础并不总是显而易见的,但在您的情况下,如果您有一系列内容为整数的节点,可以像比较它们的整数值一样比较两个节点;例如,如果存储在 A 中的整数值大于存储在 B 中的整数值,则 A > B 所以 A.compareTo(B) 返回 1。

至于使用扩展而不是实现的方向 - 好吧,当您使用泛型类型(例如 T)时,您使用扩展而不是实现。当你定义一个类时,implements 意味着你正在使用一个接口的方法头,而当你定义一个接口时,extends 意味着你正在使用这个接口作为一个超接口,很像一个类的超类。因此,如果您说 A 类实现了 Comparable,那么您是在说 A 必须有一个方法来将自己与实现 Comparable 的类进行比较。

于 2012-07-23T19:33:22.930 回答
0

包装示例;

导入 java.util.*;

/** * * @author pradeep */ public class ComparableDemo {

public static void main(String args[]) {
    User u = new User();
    u.setName("pradeep");
    User u1 = new User();
    u1.setName("Ajeet");
    User u2 = new User();
    u2.setName("sameer");
    List<User> list = new ArrayList<User>();
    list.add(u);
    list.add(u1);
    list.add(u2);
    Collections.sort(list);
    for (User user : list) {
        System.out.println(user.getName());
    }
}

}

类用户实现 Comparable {

private String name;

/**
 * @return the name
 */
public String getName() {
    return name;
}

/**
 * @param name the name to set
 */
public void setName(String name) {
    this.name = name;
}

@Override
public int compareTo(User n) {
    if (this.getName().compareTo(n.getName()) > 0) {
        return 1;
    }
    if (this.getName().compareTo(n.getName()) < 0) {
        return -1;
    }
    return 0;
}

可以在这里了解更多关于java的信息!!

于 2014-03-16T03:23:48.453 回答
0

您应该查看定义 compareTo 方法的可比较接口的文档。然后您将知道返回值在列表排序顺序方面的含义。

Comparable 是一个接口。一个接口可以扩展另一个接口。一个类可以实现一个接口。

于 2012-07-23T19:25:42.370 回答
0
public class UseComparetoMethod{

    static String arr[] = {"Ram", "Bharat", "Laxman", "Satrughna"};

    public static void main(String ar[]) {

        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j].compareTo(arr[i]) < 0) {
                    String t = arr[i];
                    arr[i] = arr[j];
                    arr[j] = t;
                }
            }
            System.out.println(arr[i]);
        }
    }
}

更完整的描述在这里

于 2013-10-19T03:47:52.113 回答