2013-12-18 57 views
1
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; 
    } 
+0

問題是什麼?你有什麼嘗試? – SimonC

+0

我們知道'value'引用的對象的運行時類型嗎? –

+0

其實我需要根據它們的值比較2個節點對象,我想爲實例成員'值'實現比較器。我知道我可以實現一個類節點,但那不是我想要的。我想實現比較值的'價值'。可能嗎 ? – Amber

回答

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; 
    } 
} 

UPDATE

我想你實際上是在問因爲是這樣的:

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的值進行比較。

+0

我正想着想出一種實現Compartor的方法,只爲實例成員'值'。可能嗎 ? – Amber

+0

是的,你可以做到這一點。我已經編輯了我的答案,並分享了一個鏈接請參考,它可以幫助你。 – rachana

+0

如果需要,您可以讓'Node'實現'Comparable ',而'compareTo'方法只檢查'value'。但是,您仍然需要知道* how *如何比較'value'。如果它僅作爲一個對象被鍵入,則只能使用在Object中定義的方法來比較它,這可能不符合你的要求。我的答案的另一種選擇是定義你自己的界面,'價值'將實現,暴露你可以用來比較它的方法。 – SimonC

1

我不知道,但嘗試這個,

有類實現Comparable interface,這給compareTo方法。然後,您可以在if語句中使用數字的值(-1表示更少,1表示更多,0表示等於)。

如果你想把這些對象放在列表中(比如,爲了排序),你還應該@覆蓋.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鏈接。

0

我能看到的唯一合乎邏輯的方法是爲我的Node類實現Comparable。僅爲「價值」實例成員實施比較協議似乎不合邏輯。

相關問題