0

URI のパラメーターを含む Map を返すメソッドを作成しました。キーが map.containsKey(value) 以外の Map に既にあるかどうかを確認する他の方法はありますか???

 public static Map <String,Object> UriMap(String uri){
    Map <String,Object> map = new HashMap<String,Object>();     
    String [] pathAndQuery = uri.split("\\?",2);    

    if(pathAndQuery.length == 2){//processing starts only if the size of pathAndQuery is 2
        String [] query = pathAndQuery[1].split("\\&");//split the string to array of Strings
        for(String str: query){
            if(str.contains("=")){
                String [] keysAndValues = str.split("\\=",2);                   
                if(map.containsKey(keysAndValues[0])){
                    String oldValue = map.get(keysAndValues[0]).toString();     
                    map.remove(keysAndValues[0]);
                    map.put(keysAndValues[0],Arrays.asList(oldValue, keysAndValues[1]));//for parameters listed twice put a list to value                                       
                }else{                                  
                    map.put(keysAndValues[0],keysAndValues[1]);//put a String to a map
                }
            }else{
                String newParameter = str;
                map.put(newParameter,"");//if "=" symbol is missing I put empty string for value
            }
        }
    }

    return map;
}
4

3 に答える 3

0

あなたが尋ねたことに誰も答えていないことに気づきました。これは恥ずかしいことですが、以前の回答がいずれ誰かの役に立つと思うので、新しい回答を作成することにしました。

あなたの Map は HashMap であるため、一定時間 O(1) でキーが含まれているかどうかを判断できるため、質問に対する直接的な答えは次のようになります。

はい、keySet をループして比較するなど、キーが既にマップにあるかどうかを確認する単純な方法は他にもありますが、現在行っていることが最善の方法です。

以下は、Java6 の HashMap ドキュメントからのものです。

この実装は、ハッシュ関数が要素をバケット間で適切に分散すると仮定すると、基本操作 (get および put) に対して一定時間のパフォーマンスを提供します。コレクション ビューの反復には、HashMap インスタンスの「容量」(バケットの数) とそのサイズ (キーと値のマッピングの数) に比例する時間が必要です。したがって、反復のパフォーマンスが重要な場合は、初期容量を高く設定しすぎないようにする (または負荷係数を低く設定しすぎない) ことが非常に重要です。

于 2012-07-11T08:36:19.570 に答える
0

Apache HTTP Components Libraryを使用することをお勧めします。「クライアント」ライブラリには、URI を (文字列または URI インスタンスとして) 受け取り、NameValuePairs のリストを返すparse メソッドがあります。

その方法は

org.apache.http.client.utils.URLEncodedUtils.parse(String s, Charset charset);

また

org.apache.http.client.utils.URLEncodedUtils.parse(URI uri, String encoding); 

また、最初に Java URI クラス文字列コンストラクターを使用して URI 文字列を URI インスタンスに変換することをお勧めします。これは、URI が適切に形成されていない場合、コンストラクターが URISyntaxException をスローするためです。上記の偏差」。

于 2012-07-11T07:42:19.057 に答える
0

あなたのやり方はそれほど悪くはありませんが、クエリ文字列値をエスケープ解除するのを忘れています。何かのようなもの:

String value = URLDecoder.decode(keysAndValues[0], "UTF-8");

たとえば、「?」、「=」、「&」などの文字はエスケープされるためです。

コードで実行できる最適化の 1 つは、split を使用せず、indexOf を使用することです。したがって、分割して配列を作成することはありませんが、同じ値を 2 回循環させることはありません。

于 2012-07-11T07:41:55.990 に答える