2013-12-13 24 views
0

說我構建了一個整數節點像這樣:如何枚舉基於Java中節點的對象?

Node<Integer> node = new Node<Integer>(0, new Node<Integer>(1, new Node<Integer>(2, null))); 

而得到看起來像 「0 -​​--> 1 ---> 2」 的節點。

我的目標是,當我運行命令等node = node * 4 + 28;,節點將看起來像 「28 ---> 32 ---> 36」,WITHOUT使用的功能,例如multiply(...)

也就是說,node = node * 4 + 28而不是node.multiply(4); node.add(28);(除非它用作一個更大的解析功能的專用功能 - 一個功能我想避免,如果可能的話)

有沒有辦法一一列舉腫大等數據結構(如Queue和Stack)就像Java中的那樣?

(小記:。節點本身是通用的它不具有與絃樂的工作,但它會是非常好的,如果它沒有,雖然)

提前感謝!

對於那些有興趣,節點看起來是這樣的:

public class Node<T> { 
    private T info; 
    private Node<T> next; 
    ... 
} 
+0

遞歸怎麼樣? – 2013-12-13 12:25:07

+0

[訪客](http://en.wikipedia.org/wiki/Visitor_pattern)模式。 – Seelenvirtuose

+0

@RC:如果你在談論一個「永不結束」的節點,我假設沒有遞歸。如果你正在談論使用遞歸 - 我首先需要知道如何在節點「成員」上執行所需的操作... – user3053080

回答

2
public class Node { 
    private int value = 0; 
    private Node next = null; 
... 
    public void multiply(int num) { 
     value *= num; 
     if (next != null) 
      next.multiply(num); 
    } 
} 
+0

這裏唯一需要警惕的是循環引用讓你陷入無盡的遞歸循環,直到你碰到了一個StackOverflowError。這可以通過在集合被處理之後但在調用'next.multiply'之前將每個節點添加到集合並且只有在next集合中不存在處理節點時才調用'next.multiply'來避免(以一定代價)。或者,如果循環引用在設計上是不允許的,那麼可以在'next'被賦值時檢查循環引用,並且如果找到循環引用則拋出IllegalArgumentException。 – megaflop

+0

其實我沒有想到無限循環的情況,謝謝! – user3053080

+0

@ user3053080這是遞歸(即乘法自我調用,直到遇到一個條件) – 2013-12-13 15:33:38

1

如果我有問題的權利,你要尋找的功能通常被稱爲地圖,它不存在於Java本身。

但是,它是功能性編程中常用的範例,因此您可能需要檢查Guava,它爲Java用戶提供了許多功能特性。