2013-06-27 61 views
2

我已經在MVEL中創建了一個地圖,我必須使用foreach對它進行迭代。我會怎麼做?如何遍歷在MVEL中創建的地圖

有一個類似的問題: How to iterate over a map in mvel 但在這種情況下,地圖是用Java創建,不得不返回鍵(的entrySet)陣列這是不符合我的情況的方法。

//MVEL 
map = [ 
'a': 'a1', 
'b': 'b2', 
'c': 'c3' 
]; 

foreach (key: map) { 
    System.out.println(key); 
} 

我已經在foreach循環中嘗試過map和map.entrySet,但似乎都沒有工作。

注:我測試了使用MVEL命令行和使用MVEL版本2.2.0.15

+0

我不認爲有任何區別。在MVEL中創建的地圖仍然是一個地圖。只要按照相同的方式進行迭代即可。 –

+0

@AdrianShum嘗試使用key:map.entrySet,但它不起作用。此外,嘗試關鍵:地圖和關鍵:map.keys但無濟於事。獲取「無法訪問屬性」錯誤。 – Fakhruddin

+0

夠奇怪的......你接受的問題就是我所說的:把它當作地圖......而這正是你回答你所引用的另一個問題時所說的。 –

回答

1

雖然你已經接受了答案,我認爲最好補充一些東西,以免誤導他人:

...不得不返回鍵(的entrySet)的陣列中,不與我

第一的情況下的方法,圖的就是一個地圖。在MVEL中創建的地圖只是一個「Java」地圖。迭代的方式是一樣的,他們提供相同的方法

其次,entrySet()沒有返回「數組鍵」。它返回一組條目(如其名稱所示)。

我不確定你爲什麼不能使用entrySet,因爲它對我來說工作得很好。我懷疑你有做foreach (e : map.entrySet)。這是行不通的,因爲在MVEL中,屬性導航可能意味着一些東西,比如bean屬性(這意味着它會調用map.getEntrySet()),或者查找地圖(這意味着它會調用map.get('entrySet')),或者獲取字段(意思是「 map.entrySet')。但是,所有這些都不適合您的情況。你只是想調用map.entrySet()方法,因此,你應該只是做foreach (e : map.entrySet())

正確的方法做的是這樣的:

map = ['a':'a1', 'b':'b1'] ; 
foreach(entry : map.entrySet()) { 
    System.out.println('key ' + entry.key + ' value ' + entry.value) 
}; 
+0

當我執行map.entrySet()時,它會起作用。我是MVEL的新手,當我在其他問題(在描述中提到)中看到此語法時,我感到困惑。正如你所說,entrySet可以有多種含義,你可以解釋(或給出鏈接)哪些實際運行(或選擇的優先級) – Fakhruddin

+0

我給你的代碼可以運行...我可以知道這個問題嗎?而且,它不是具有不同含義的'entrySet',它是MVEL的屬性導航語法。當您通過'foo.prop'導航屬性時,MVEL將嘗試通過各種方式來解釋'prop'屬性的含義。嘗試讓自己熟悉Java和MVEL的基礎知識。 –

+0

代碼運行良好,只是想知道當我使用它而沒有括號時mvel正在尋找什麼。 – Fakhruddin

0

您可以使用這樣的事情:

map = [ 
'a': 'a1', 
'b': 'b2', 
'c': 'c3' 
]; 

foreach (key : map.keySet()) { 
     System.out.println("Key:" + key + " Value:" + map[key]); 

} 

它輸出:

Key:b Value:b2 
Key:c Value:c3 
Key:a Value:a1