私はList<Object>
というjavaを持ち、各オブジェクトはStringとIntegerを含むStringです。私はそれがAPIメソッドによって返されるので、Listを制御することはできません。オブジェクトのリストをJavaのハッシュマップに変換します
リストを地図にキャストしたいと思います。これを行う最善の方法は何ですか?
私はList<Object>
というjavaを持ち、各オブジェクトはStringとIntegerを含むStringです。私はそれがAPIメソッドによって返されるので、Listを制御することはできません。オブジェクトのリストをJavaのハッシュマップに変換します
リストを地図にキャストしたいと思います。これを行う最善の方法は何ですか?
好きな型(HashMap、TreeMap、HashTable、...)のマップを作成してリストを繰り返し、すべての要素を1つずつ追加します。
良い方法はありません(ただし、このリストに裏付けされた独自のマップをコード化したい場合は - 本当にうまくいく場合もあります)。
追加する要素の数が既に分かっているため、要素を追加する前にマップの種類にいくつかのオプションを設定することができます(サイズの設定など)。パフォーマンスが少し向上する可能性があります。あなたのユースケースに大きく依存します。
EDIT:リストに文字列と整数属性を持つPOJOが含まれるように質問しているので、これを述べました。それが違うなら、答えは異なるかもしれません。あなたがされているオブジェクト<String, Integer>
が、これは地図はここにあるコードである場合について、何を意味するかわからない
ループリストを超えると、新しい地図にそれらを保存する:あなたは、同じ文字列のキーで、リスト内の複数のアイテムを持っている場合は、それらがマップで互いを上書きすること
Map<String, Integer> result = new HashMap<String, Integer>();
for(Map<String,Integer> item : list){
result.putAll(item);
}
注意。
:
はMap<String,Integer> map=new Hasmap<String, Integer>();
for(Object o:list){
Map<String,Integer> m=(Map<String,Integer>)o
map.putAll(m)
}
あなたは
かかわらず、「キャスト」キーオーバーライドすることで、データを失う可能性があり、つまり、リストを別の型のものとして扱うことは、APIによって返されたオブジェクトもMapを実装していなければ機能しません(明らかにそうではありません)。しかし、リストのコンテンツからMapを作成することはできます。
Furter:リストには1つのタイプのオブジェクトのみが含まれているので、リストには<String, Integer>
を含めることはできません。この、
Map<String, Integer> map = new HashMap<String, Integer>(list.size()); // the size of the map will be the size of the list.
for(Element e: list) {
map.put(e.key, e.value);
}
リストもそのエントリでもないが、後に変更されません場合は、次のようなものについては
public class Element {
public String key;
public Integer value;
}
、明白な解決策のようなある:私は、それがこのようなオブジェクトが含まれていると十分であるはずです。何か問題がある場合は、リストのオンザフライ変換を行う独自のマップを実装する必要があります。変更内容に応じて、これは、多かれ少なかれ複雑ですが、すべてが変更されることがあります場合は、マップにリストを変換する新しいクラス作成することができます。
class ListTranslatorMap extends AbstractMap<String, Integer> {
private List<Element> list;
public ListTranslatorMap(List<Element> list) {
this.list = list;
}
public Set<Map.Entry<String, Integer>> entrySet() {
return new AbstractSet<Map.Entry<String, Integer>>() {
public int size() {
return list.size();
}
public Iterator<Map.Entry<String, Integer>> iterator() {
final Iterator<Element> listIterator = list.iterator();
return new Iterator<Map.Entry<String, Integer>>() {
public boolean hasNext() {
return listIterator.hasNext();
}
public void remove() {
listIterator.remove();
}
public Map.Entry<String, Integer> next() {
final Element element = listIterator.next();
return new Map.Entry<String, Integer>() {
public String getKey() {
return element.key;
}
public Integer getValue() {
return element.value;
}
public Integer setValue(Integer value) {
Integer prev = element.value;
element.value = value;
return prev;
}
};
}
};
}
};
}
}
をしかし、通常、これはやり過ぎだろうと単純な変換forループで十分です。 Mapを扱う方法がもっと必要な場合、または地図ではなくキーと複数のエントリを持つMultimapが必要な場合は、com.google.common.collect.Mapsに便利なインデックス関数を持つGoogle Guavaライブラリを見てください。
お返事ありがとうございました!私はあなたの方法もうまくいくはずだと思う –
はい、この場合はPOJOのリストです。 –