2012-06-29 342 views
1

用戶具有數字ArrayList。這些數字對應於他們有權訪問的應用程序。某些應用程序具有不同的權利號碼(即-3,72等)。我想要做的就是將這些數據存儲在地圖中,這樣當用戶登錄時,他們可以將數字輸入到Map中並快速獲取他們有權使用的應用程序。但是,某些應用程序需要2至3個授權號碼。例如,一個條目可以是:(「101和234」,「應用程序1」)。我想知道是否有一種理想的方式來從地圖上檢索用戶權利數字滿足的所有值。需要幫助存儲/檢索數據

我目前如何擁有它,程序會將用戶數據與每個應用程序進行比較,並確認或拒絕訪問。這似乎效率低下。任何幫助我們非常感謝!

注意:我正在從XML中讀取應用程序和它們的數字,所以我可以按照需要存儲它們。

+0

你能澄清與例如你的問題?我認爲我沒有把所有的情況都弄清楚。 – nhahtdh

+0

對不起,每次用戶登錄時,我想比較它們的字符串列表與對應於應用程序的字符串映射。用戶權利號碼可能類似於:{「1」,「2」,「3」,「5」}。我想比較這個字符串列表和所有的應用程序編號。大多數應用程序有1個授權號碼。因此,我在地圖中輸入1,然後返回「應用程序3」。沒事兒。但是一些應用程序需要授權號碼「2和3」。我在O(1)時候遇到麻煩,因爲這些數字是複合的。我在考慮讓另一個地圖輸出另一個 – cspada

+0

是這樣的情況:「1」 - >「App1」,「2」 - >「App2」,{「1」,「2」} - >「AppTwoEntitlement」 ?如果你給{「1」,「2」},它會返回所有3個應用程序嗎? – nhahtdh

回答

0

如果每個應用程序需要大量的數字,最好的方法是使用集合交集。如果這些數字是連續的或者至少是密集的,那麼可以將其優化爲一個bitset。儘管只有一兩個數字,但我建議只測試每個數字,因爲它可能比全套操作更快。

0

解決辦法:

  • 定義爲每個應用類(姑且稱之爲App)。該類包含應用程序的名稱和一個(排序的)列表/權利數組。
  • 使用地圖從字符串映射到AppMap<String, App>所有單一權利應用程序(您可以使用HashMapTreeMap - 您的選擇)。如果有多個只需要一個權利的應用程序,請考慮Map<String, List<App>>。從Map中排除需要多個權利的應用程序,然後將它們存儲在單獨的List /數組中。
  • 當您獲得檢索應用程序的權利列表時,請遍歷列表並抓住Map將字符串映射到的所有內容。對於那些需要多個權利的人,只需單獨檢查(您可以通過對授予的權利列表進行排序來加快檢查速度,並按照排序順序將權利存儲到每個App - 但由於規模較小,因此可能無關緊要) 。

該解決方案降低了操作的時間複雜性。然而,在我看來,幾百個應用程序乘以10左右的權利數量是非常小的,除非您多次打電話。而且最好是把你的原始方法和這種方法進行比較 - 因爲開銷可能會影響時間的改進。

的進一步提高(或沒有)的位爲:

  • 使用Map<String, List<App>>和甚至包括需要多個應用程序的權利(這些應用程序將被許多權利被映射到)。
  • 當我們搜索應用時,我們將使用Map<App, Integer>來跟蹤我們爲多個授權應用確認了多少權利。因此,流動將是這樣的:

    new mapAppInteger 
    foreach entitlement in inputListOfEntitlement 
        listOfApps = mapStringAppList.get(entitlement) 
    
        if listOfApps found 
         for each app in listOfApps 
          if app needs singleEntitlement 
           put app in output list 
          else // needs multiple 
           if app is in mapAppInteger 
            map app --> count + 1 
            if mapAppInteger.get(app) == app.numberOfRequiredEntitlement 
             put app in output list 
             remove app from mapAppInteger 
           else // not in mapAppInteger 
            map app --> 1 
    
+0

@NerdEcho:發佈編輯。 – nhahtdh

+0

非常感謝!我會比較這兩個! – cspada