2017-03-29 38 views
0

我在我的項目中第一次使用ArrayMap,我認爲它就像數組一樣工作。我期望當我使用.put方法插入它在下一個索引。 但在我的情況下,這是不正確的 - 在我逐個添加所有元素之後,我添加的第一個元素結束於索引4,這有點奇怪。ArrayMap put方法以奇怪的順序推動元素

這裏是前三個步驟,其餘添加元素:

1 - 沙拉:

enter image description here

2 - 湯類:

enter image description here

3 - 開胃:

enter image description here

因此,第二步「湯」元素插入索引0而不是1,因爲我期待,但奇怪的是第三步「開胃菜」插入後,如預期的「湯」。

這是我使用推鍵和值對代碼:

function ArrayMap<String, DMType> addElement(String typeKey, DMType type) { 
    ArrayMap<String, DMType> types = new ArrayMap<>(); 
    types.put(typeKey, type); 

    return types; 
} 

我失去了一些有關ArrayMap的行爲?

+1

嘗試改用ArrayMap的LinkedHashMap的。 –

+0

如果要使用保證順序的Map功能,請改用LinkedHashMap。內存明智的,比傳統的HashMap效率更高的 – dsharew

回答

1

是的,因爲它的名字是誤導的,但ArrayMap沒有保證順序不像數組。

ArrayMap是一個通用的key-> value映射數據結構,它被設計爲比傳統的HashMap更高的內存效率。

ArrayMap實際上是一個地圖:

公共類ArrayMap擴展如果你想與秩序存在保證使用LinkedHashMap的地圖功能,而不是SimpleArrayMap實現地圖

LinkedHashMap的定義迭代排序,這通常是在哪個鍵被插入到圖(插入順序) 順序。

documentation

+0

我是否能夠如果我使用LinkedHashMap,按索引獲取元素? – Binev

+0

不,但是如果你有索引,你可以使用鍵來獲取元素。但是如果你爲每個循環使用一個簡單的函數,你將能夠在它們被插入時迭代它們。 – dsharew

1

它不工作,作爲一個數組,我看不出在名稱ArrayMapdocumentation明確規定,表現爲一個通用密鑰 - >值映射,更有效,比傳統HashMap實現(內存明智) 。

其實我不明白你爲什麼會關心與插入命令相比的順序。數據在類中是私有的,你無法通過索引獲取元素,所以你基本上想知道與它的使用無關的私有實現。

如果你真的想了解它如何存儲它的數據,你應該看看source code

+1

。速度不明智。只是爲了澄清讀者 – Edd

+0

那麼我提供的代碼只是我想實現的一個簡單部分! 我需要有List ,我可以通過索引和String值獲取元素。例如,我需要知道什麼元素被推到第二個 – Binev

1

ArrayMap不像Array那樣工作,相反,它的工作原理類似於具有性能優化的HashMap。

由於鍵值對不是合同的一部分,因此不保證鍵值對的內部順序。

在你的情況,你真的想使用什麼可能是一個ArrayList<Element>,其中元件類別是這​​樣定義的:

public class Element{ 
    private final String typeKey; 
    private final DMType type; 
    public Element(String typeKey, DMType type){ 
      this.typeKey = typeKey; 
      this.type = type; 
    } 
} 

如果你不希望一個新的類只是存儲結果,並且您想保留序列,則可以使用LinkedHashMap<String, DMType>。由於該文件規定:

類LinkedHashMap的

的哈希表和鏈接列表實現Map接口的,具有可預知的迭代順序。這個實現與HashMap的不同之處在於它保持了一個雙向鏈表,它貫穿其所有條目。這個鏈表定義了迭代排序,這通常是鍵被插入映射的順序(插入順序)。請注意,如果將鍵重新插入到地圖中,則插入順序不受影響。 (密鑰K被重新插入到圖M如果m.put(K,V)是當m.containsKey(K)將調用之前立即返回true調用。)

+0

問題是我不想有一個新的類,我也希望能夠輕鬆地通過鍵獲取元素。 我想知道如何使用ArrayList > – Binev

+0

嘗試LinkedHashMap,因爲我剛剛修改了答案。 –

1

我想它的工作原理就像一個陣列

不,它的作用就像一張地圖,因爲它是一張地圖。它與HashMap類似,但對於較小的數據集有更高的內存效率。

它的順序不應該也沒關係。在引擎蓋下,它是通過使用 數組來實現的,該數組自數組開始有順序。這本質上給了ArrayMap一個訂單,但這不是它的API的一部分。就像Java對象所在的內存插槽一樣,您也不應該在意這裏的順序。

+0

所以我選擇了錯誤的類型。 我實際上想要使用像這樣的鍵值對的Array功能: ArrayList LinkedHashMap是最好的選擇嗎? PS我知道我可以使用選項ArrayList 但我不想有這樣的故意新的類,我也想有可能通過鍵獲得元素 – Binev