0

マップ内のドメインごとにCookieのリストを保存するCookieマネージャークラスがあります。サイズはほとんどの場合100未満にとどまります。

Map<String, CookieList> cookieMap;

接続用にCookieを設定するたびに、すべてのドメイン(String)を反復処理し、それが受け入れ可能かどうかを確認してから、を挿入する必要がありCookieListます。マップを何度も繰り返します。ドメインを保持する別のリストがあり、それを検索してからCookieList、キーで取得します。

List<String> domainList;

// host is from the connection being set up
for (String domain : domainList) {
    if (host.contains(domain)) {
        CookieList list = cookieMap.get(domain);
        // set up cookies
    }
}

を使用しているcontainsため、から直接キーを取得することはできませんcookieMap。これは良い方法ですか、それともMapのEntrySetを繰り返すだけですか?もしそうなら、LinkedHashMapはこの例で良いでしょうか?

4

3 に答える 3

3

Mapとを維持する代わりに、ドメインを取得するためにList使用できます。Map.keySet

for (String domain : cookieMap.keySet()) {
    if (host.contains(domain)) {
        CookieList list = cookieMap.get(domain);
    }
}

forループはO(n)であり、cookieMapの呼び出しはO(1)であるため、これについて非効率なことは何もありません。

于 2013-03-09T18:10:23.157 に答える
1
Map<String, CookieList>  coockieMap = new HashMap<String, CookieList>();
for (Map.Entry<Integer, CookieList> entry : coockieMap.entrySet()) {
    if (host.contains(entry.getKey())) {
        CookieList list = entry.getValue();
    }
}

これがお役に立てば幸いです。

于 2013-03-09T18:21:17.340 に答える
1

あなたのコードはかなり最適化されていると思います、あなたが望むなら、あなたは使うことができます

domainList.retainAll(hosts)

forループの前にあるため、ループごとにチェックを実行するのをやめます。事実上、コードは次のようになります。

List<String> hostList = new ArrayList<String>(domainList); // we don't want to edit domains

hostList.retainAll(host);  

for (String hostEntry : hostList) { // I'd rename "host" so I can use it here
        CookieList list = cookieMap.get(hostEntry);
        // set up cookies
}
于 2013-03-09T19:12:50.817 に答える