如何为实例成员编写compareTo?

时间:2013-12-18 05:45:33

标签: java instance-variables

public class Ch3Ex2 {
static class Node {
    Node(Object value) {
        this.value = value;
    }
    Object value; // Comparator for this field required
    Node next;
}


static class Stack {
    Node Top;
    Node Min;
    void push(Object value) {
        Node node = new Node(value);
        if(Top == null) {
            Min = node;
        } else {
            Min = (Min.value < node.value) ? Min : node;  // Comparator Needed to be used here
        }
        node.next = Top;
        Top = node; 
    }

3 个答案:

答案 0 :(得分:1)

我不确定但是试试这个,

让类实现Comparable interface,它提供compareTo方法。然后,您可以在if语句中使用数字的值(-1表示less,1表示更多,0表示equals)。

如果你想把这些对象放在列表中(例如,用于排序),你也应该@Override .equals方法。

例如:

import java.util.Comparable;

public class BlockOffset implements Comparable<BlockOffset>
{
   private int blockNumber;
   private int offset;

   @Override
   public int compareTo(BlockOffset instance2) {
   if (this.blockNumber < instance2.blockNumber) return -1;
   if (this.blockNumber > instance2.blockNumber) return 1;
   if (this.offset < instance2.offset) return -1;
   if (this.offset > instance2.offset) return 1;

   return 0;
 }   
}

有关详细信息,请查看this链接。

答案 1 :(得分:0)

我想你要声明你的Node类:

class Node<T extends Comparable<T>> {
    T value;
    Node next;
    Node(T value) {
        this.value = value;
    }
}

然后你的Stack会是这样的:

class Stack<T extends Comparable<T> {
    Node<T> Top;
    Node<T> Min;
    void push(T value) {
        Node<T> node = new Node<T>(value);
        if(Top == null) {
            Min = node;
        } else {
            Min = Min.value.compareTo(node.value) < 0 ? Min : node;
        }
        node.next = Top;
        Top = node; 
    }
}

<强>更新

我认为你实际要求的是:

class Node<T> {
    T value;
    Node next;
    Node(T value) {
        this.value = value;
    }
}

class Stack<T> {
    Node<T> Top;
    Node<T> Min;
    final Comparator<T> valueComparer;
    public Stack(Comparator<T> valueComparer) { this.valueComparer = valueComparer; }
    void push(T value) {
        Node<T> node = new Node<T>(value);
        if(Top == null) {
            Min = node;
        } else {
            Min = valueComparer.compare(Min.value, node.value) < 0 ? Min : node;
        }
        node.next = Top;
        Top = node; 
    }
}

这意味着您的值类不需要实现Comparable,只要构造Stack对象的类知道如何通过传入Comparator来比较值。

答案 2 :(得分:0)

我能看到的唯一合乎逻辑的方法是为我的Node类实现Comparable。仅为'value'实例成员实现比较协议似乎不合逻辑。