1

ユーザーは、数値の ArrayList を持っています。これらの番号は、アクセスできるアプリケーションに対応しています。特定のアプリケーションには、異なる資格番号 (つまり、3、72 など) があります。私がやりたいのは、このデータをマップに保存して、ユーザーがログインしたときに番号をマップに入力して、資格のあるアプリケーションをすばやく取得できるようにすることです。ただし、一部のアプリケーションでは、2 ~ 3 個の資格番号が必要です。たとえば、1 つのエントリは ("101 and 234", "Application 1") のようになります。ユーザーの資格番号が満たすマップからすべての値を取得する理想的な方法があるかどうか疑問に思っていました。

私が現在持っている方法では、プログラムはユーザーデータを各アプリケーションと比較し、アクセスを確認または拒否します。これは非効率に思えます。どんな助けでも大歓迎です!

注: アプリケーションとその番号を XML から読み取っているので、必要に応じて保存できます。

4

2 に答える 2

0

ソリューション:

  • アプリケーションごとにクラスを定義します ( と呼びましょうApp)。このクラスには、アプリケーションの名前と、資格の (ソートされた) リスト/配列が含まれます。
  • Map を使用して String からApp:にマップしMap<String, App>、すべての単一エンタイトルメント アプリに対して (HashMapまたはTreeMap- を選択して使用できます)。1 つの同じ資格だけが必要なアプリが複数ある場合は、 を検討してMap<String, List<App>>ください。複数の資格が必要なアプリをマップから除外し、代わりに別のリスト/配列に保存します。
  • アプリを取得する権利のリストが表示されたら、リストをループしてMap、文字列をマップするすべてのものを取得します。複数の資格が必要な場合は、個別に確認してください (指定された資格のリストを並べ替え、それぞれの資格をApp並べ替えた順序で保存することで、チェックを少し高速化できますが、サイズが小さいため問題にならない場合もあります)。

このソリューションにより、操作の時間の複雑さが軽減されます。ただし、これを何度も呼び出さない限り、数百のアプリに約 10 の資格の数を掛けた数は、私の意見では非常に小さいと思います。また、元のアプローチとこのアプローチを比較するために時間を計る方が良いでしょう。オーバーヘッドが時間の改善に影を落とす可能性があるためです。

さらなる改善のビット (またはない) は次のとおりです。

  • 複数の資格が必要なアプリも使用Map<String, List<App>>して含めます (これらのアプリは、多くの資格によってマップされます)。
  • アプリを検索するときはMap<App, Integer>、複数の資格アプリについて確認した資格の数を追跡するために a を使用します。したがって、フローは次のようになります。

    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 に答える
0

アプリケーションごとに多数の数値が必要な場合、最良のアプローチはセット交差を使用することです。数値が連続しているか、少なくとも密集している場合は、これをビットセットに最適化できます。ただし、1 つまたは 2 つの数値のみの場合は、各数値を個別にテストすることをお勧めします。これは、完全なセット操作よりも高速である可能性が高いためです。

于 2012-06-29T04:08:16.437 に答える