用户有一个数字列表。这些数字对应于他们可以访问的应用程序。某些应用程序具有不同的权利号码(即-72,72等)。我想要做的是将这些数据存储在地图中,这样当用户登录时,他们可以将他们的数字输入到地图中并快速获得他们有权使用的应用程序。但是,某些应用程序需要2到3个权利号码。例如,一个条目可以是:(“101和234”,“应用程序1”)。我想知道是否有一种理想的方法可以从地图中检索用户权利数字满足的所有值。
我目前如何拥有它,该程序将用户数据与每个应用程序进行比较并确认或拒绝访问。这似乎效率低下。任何帮助我们非常感谢!
注意:我正在从XML中读取应用程序及其编号,因此我可以按照自己的意愿存储它们。
答案 0 :(得分:0)
如果每个应用程序需要大量数字,最好的方法是使用set intersection。如果数字是连续的或至少是密集的,您可以将其优化为bitset。但是,对于只有一两个数字,我建议单独测试每个数字,因为它可能比完整设置操作更快。
答案 1 :(得分:0)
解决方案:
App
)。该类包含应用程序的名称和(已排序)列表/权利数组。App
:Map<String, App>
(您可以使用HashMap
或TreeMap
- 您的选择)。如果有多个应用只需要一个相同的权利,请考虑Map<String, List<App>>
。从Map中排除需要多个权利的应用程序,并将它们存储在单独的List / array中。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