2015-10-15 58 views
2

我需要解決兩個問題,我們的項目,其中(1)我必須找到一種方法,我可以保留一個數組(String []或int [])作爲地圖。要求是,如果兩個數組的內容相同(String [] a = {「A」,「B」},String [] b = {「B」,「A」}),那麼它們應該被視爲等於/相同的鍵,即,如果我使用a或b作爲Map的鍵,則a.equal(b)= true字符串數組作爲HashMap的鍵

我發現Java集增加了存儲在其中的所有對象的哈希碼。散列碼的添加允許比較兩個哈希集,以查看它們是否相等,這意味着這種機制允許根據其內容比較兩個Java集。

因此,對於上述問題,我可以使用套件作爲地圖的關鍵,但事情是我想使用數組作爲關鍵。那麼對此有何想法? (2)接下來的事情是,我們對高效的部分密鑰匹配機制感興趣。例如,查看Map中的任何鍵是否包含數組的一部分,例如查找Key.contains(new String [] {「A」})。

請分享您的想法,任何替代方式,我關心空間和時間的最佳實施。這將在數​​據流處理項目中使用。所以空間和時間確實是一個問題。

+2

爲了方便起見,您可能會更喜歡'Set';這樣,你可以保證圍繞'equals'和'hashCode'發生的行爲。 – Makoto

+0

也參見[能否Java數組被用作一個HashMap鍵](http://stackoverflow.com/questions/16839182/can-a-java-array-be-used-as-a-hashmap-key)。正如所建議的,你應該使用'Set'來代替,因爲你不能覆蓋數組的'equals' /'hashCode'的行爲。 –

+0

好的,第二個問題呢,有什麼想法? – Zubair

回答

0

我嘗試使用lambda表達式在Java8解決您的問題

對於問題1:

String[] arr1 = {"A","B","A","C","D"}; 
    List<String> list1 = new ArrayList<String>(new LinkedHashSet<>(Arrays.asList(arr1))); 
    list1.stream().forEach(x -> System.out.println(x)); 

如果您想對它們進行比較,如果他們是平等的。我建議你可以先排序然後比較。 當然,這是更好的使用設置和hashCode做comparsion

對於問題2(在上面會被重新使用的一些變量):

String[] arr2 = {"A"}; 
    List<String> list2 = new ArrayList<String>(Arrays.asList(arr2)); //Assume List2 element is also unique 
    int NumOfKeyContain = list1.stream().filter(a -> (list2.stream().filter(b -> !b.equals(a)).count())<list2.size()) 
      .collect(Collectors.toList()) 
      .size(); 
    System.out.println(NumOfKeyContain); //NumOfKeyContain is the number that of key in list2 contained by list1 
+0

你看過我的追求?您的第一個解決方案如何幫助進行關鍵映射您只需將字符串數組添加到列表中,然後將其打印出來。 – Zubair

+0

如果我誤解了你的問題,請澄清我。我已經在關鍵映射中添加了我的建議。您可以先對它們進行排序,然後以快速方式逐個比較元素,以確定兩個列表中包含的關鍵字是否相等。它解決了該目的(字符串[] A = { 「A」, 「B」},字符串[] B = { 「B」, 「A」})必須可被定義相等。對於代碼部分,我只是消除了重複。對於比較部分,我使用單詞而不是代碼。 – SerMintt

+0

我需要使用它們作爲HashMap的鍵,所以真正的問題是解決這個問題 – Zubair

1

Q1 - 你不能使用裸數組作爲HashMap鍵,如果你想要基於數組元素的鍵相等。陣列從java.lang.Object繼承equals(Object)hashCode()實現,它們基於對象標識,而不是陣列內容。

我能想到的最佳選擇是將數組包裝爲(不可變)列表。第二季度 - 我不認爲有一個簡單有效的方法來做到這一點。我能想到的最好的是:每個數組的

  • 提取出所有可能的子陣列,使每一個哈希表的替代鍵。問題是密鑰將採用O(N M^2)空間,其中M是主鍵String[]中字符串的平均(?)數。查找仍然是O(1)

  • 構建一個倒排索引,給出每個字符串在所有鍵中的位置,然後對鍵空間中的字符串序列進行「詞組搜索」。這應該在空間使用方面更好地擴展,但是查找會更加昂貴。而且很複雜。