5

これは非常に単純な質問だと思いますが、答えが見つかりませんでした。

HashMap の put メソッドに配列オブジェクトを入力できますか?

例:

HashMap があるとします。
HashMap<Integer, String> map = new HashMap <Integer, String>();

整数の配列と文字列の配列が便利に与えられています。配列は以下に示すように初期化されていませんが、不明な値が含まれています (これは結果を説明するのが簡単です)。

int[] keys = {1, 3, 5, 7, 9};
String[] values = {"turtles", "are", "better", "than", "llamas"};

HashMap のキーと値のペアを次のようにします。

1, turtles
3, are
5, better
7, than
9, llamas

これは次のようなもので達成できますmap.put(keys, values)か? 「 The method put(Integer, String) in the type HashMap is not applied for the arguments (int[], String[]) 」のようなエラーが発生するはずです。次のものよりも効率的で、エレガントで、コンパクトなものが欲しいだけです。

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}
4

5 に答える 5

5

想像できない

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}

はるかに効率的にすることができます。それがあなたが頻繁にやろうとしているようなものなら、私はおそらく周りにヘルパーオブジェクトを書くでしょうMap

追加する値がすでにマップにある場合は、Map.putAll()が存在することに注意してください。

于 2013-02-19T10:31:02.610 に答える
2

私の意見では、この問題に対する非常に単純なアプローチをすでに発見しています。

HashMap<Integer, String> map = new HashMap <Integer, String>();
int[] keys = {1, 3, 5, 7, 9};
String[] values = {"turtles", "are", "better", "than", "llamas"};

for(int i = 0; i < keys.length; i++){
    map.put(keys[i], values[i]);
}
于 2013-02-19T10:33:32.157 に答える
0

この動作が必要な場合は、すべての要素を解析してHashMapに配置する必要があります。最悪の場合の複雑さはO(n)であり、それを減らすことはできません。HashMapにデータを入力するには、すべての要素に触れる必要があります。
以下のコード(あなたが述べたように)が唯一の回避策です。

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}
于 2013-02-19T10:31:35.257 に答える
0

古き良きもの以外にはありませんforが、いつでも独自のソリューションを実装できます。非常に冗長なアプローチの場合:

 public class MapFromArrayBuilder {
     private MapFromArrayBuilder() {}

     public static <K, V> Binder<K, V> map(K[] keys, V[] values) {
         return new Binder(keys, values);
     }   

     public static class Binder<K, V> {
         private final V[] values;
         private final K[] keys;

         public Binder(K[] keys, V[] values) { this.keys = keys; this.values = values; }

         public void into(Map<K, V> map) {
             for (int i = 0; i < keys.length; i++) {
                 map.put(keys[i], values[i]);
             }   
         }   
     }       

それを使用すると、次のようなことができます

 public static void main(String[] args) {
     Map<Integer, String> leMap = new LinkedHashMap<Integer, String>();

     map(new Integer[] {0}, new String[] {"teste"}).into(leMap);

     for (Integer key : leMap.keySet()) {
         System.out.format("%d = %s\n", key, leMap.get(key));
     }   
 }  

しかし、読みやすさのためだけにオブジェクトを作成します:P 最もパフォーマンスの高いソリューションではありませんが、読むのはクールです:)

とにかく、古き良きものを好むfor。私は楽しみのためだけにこの種の構造を作成するのが好きです。少し命令的なコードを避けるためだけに多くのサイクルを作成するため、本番コードで使用することを意図していません:)

于 2013-02-19T10:57:35.047 に答える
0

配列を Map に直接配置する方法は他にありません。配列のすべての要素を繰り返し処理し、キーと値のペアをマップに挿入する必要があります。

于 2013-02-19T10:40:56.877 に答える