2012-06-29 154 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