1

一个用户有一个数字的 ArrayList。这些数字对应于他们有权访问的应用程序。某些应用程序具有不同的权利编号(即 3、72 等)。我想要做的是将这些数据存储在地图中,这样当用户登录时,他们可以将他们的号码输入到地图中并快速获取他们有权使用的应用程序。但是,某些应用程序需要 2 到 3 个权利编号。例如,一个条目可以是:("101 and 234", "Application 1")。我想知道是否有一种理想的方法可以从地图中检索用户权利编号满足的所有值。

我目前如何拥有它,该程序将用户数据与每个应用程序进行比较并确认或拒绝访问。这似乎效率低下。任何帮助我们都非常感谢!

注意:我正在从 XML 中读取应用程序及其编号,因此我可以随意存储它们。

4

2 回答 2

0

如果每个应用程序需要大量数字,最好的方法是使用集合交集。如果数字是连续的或至少是密集的,您可以将其优化为一个位集。不过,对于一两个数字,我建议只单独测试每个数字,因为它可能比全套操作更快。

于 2012-06-29T04:08:16.437 回答
0

解决方案:

  • 为每个应用程序定义一个类(我们称之为App)。该类包含应用程序的名称和(排序的)权利列表/数组。
  • 使用 Map 从 String 映射到App:Map<String, App>对于所有单一权利应用程序(您可以使用HashMapTreeMap- 您的选择)。如果有多个应用程序只需要一个相同的权利,请考虑Map<String, List<App>>. 从地图中排除需要多个权利的应用程序,并将它们存储在单独的列表/数组中。
  • 当您获得检索应用程序的权利列表时,遍历列表并获取Map将字符串映射到的所有内容。对于那些需要多个权利的人,只需单独检查(您可以通过对给定权利列表进行App排序并按排序顺序存储每个权利来加快检查速度 - 但由于大小很小,这甚至可能无关紧要)。

该解决方案降低了操作的时间复杂度。但是,在我看来,几百个应用程序乘以大约 10 的权利数量是非常小的,除非您多次调用。最好对您的原始方法和这种方法进行比较 - 因为开销可能会影响时间的任何改进。

进一步的改进(或没有)是:

  • 使用Map<String, List<App>>甚至包括需要多个权利的应用程序(这些应用程序将被许多权利映射到)。
  • 当我们搜索应用程序时,我们将使用 aMap<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
    
于 2012-06-29T04:12:26.783 回答