Collectionsクラスにメソッドがあります。マップに裏打ちされたセットを作る方法は?
Set<E> Collections.newSetFromMap(<backing map>)
それはバッキング・マップとマップに裏打ちされたセットとはどういう意味ですか?
Collectionsクラスにメソッドがあります。マップに裏打ちされたセットを作る方法は?
Set<E> Collections.newSetFromMap(<backing map>)
それはバッキング・マップとマップに裏打ちされたセットとはどういう意味ですか?
おそらく実装を見て照明されるだろう:
private static class SetFromMap<E> extends AbstractSet<E>
implements Set<E>, Serializable
{
private final Map<E, Boolean> m; // The backing map
private transient Set<E> s; // Its keySet
SetFromMap(Map<E, Boolean> map) {
if (!map.isEmpty())
throw new IllegalArgumentException("Map is non-empty");
m = map;
s = map.keySet();
}
public void clear() { m.clear(); }
public int size() { return m.size(); }
public boolean isEmpty() { return m.isEmpty(); }
public boolean contains(Object o) { return m.containsKey(o); }
public boolean remove(Object o) { return m.remove(o) != null; }
public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
public Iterator<E> iterator() { return s.iterator(); }
public Object[] toArray() { return s.toArray(); }
public <T> T[] toArray(T[] a) { return s.toArray(a); }
public String toString() { return s.toString(); }
public int hashCode() { return s.hashCode(); }
public boolean equals(Object o) { return o == this || s.equals(o); }
public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
public boolean removeAll(Collection<?> c) {return s.removeAll(c);}
public boolean retainAll(Collection<?> c) {return s.retainAll(c);}
// addAll is the only inherited implementation
private static final long serialVersionUID = 2454657854757543876L;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException
{
stream.defaultReadObject();
s = m.keySet();
}
}
編集 - 追加説明:
あなたが提供するマップは、このオブジェクトにm
フィールドとして使用されます。
要素にe
を追加すると、マップにe -> true
というエントリが追加されます。
public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
だから、このクラスでは、あなたのMap
単に物事がにマッピングされた値を無視して、単にキーを使用してSet
ように振る舞うオブジェクトになります。
セットは内部的にマップを使用して値を格納します。ここで、バッキング・マップは、セットによって内部的に使用されるセット・マップを参照します。 詳細については、簡単に言えば http://www.jusfortechies.com/java/core-java/inside-set.php
は、Collections.newSetFromMapはSet<E>
要素を格納するために提供さMap<E>
実装を使用しています。
は私だけのためのサンプルコードを作ったあなた
HashMap<String, Boolean> map = new HashMap<String, Boolean>();
Set<String> set = Collections.newSetFromMap(map);
System.out.println(set);
for (int i = 0; i < 10; i++)
map.put("" + i, i % 2 == 0);
System.out.println(map);
System.out.println(set);
と出力
[]
{3=false, 2=true, 1=false, 0=true, 7=false, 6=true, 5=false, 4=true, 9=false, 8=true}
[3, 2, 1, 0, 7, 6, 5, 4, 9, 8]
Javadocから:対応するSet実装(HashMapやTreeMapなど)を既に持っているMap実装でこのメソッドを使う必要はありません。 – Jasper
、 –
私の主な質問は集合を支持しているいくつかの説明を追加してください、あなたはそれらとはどういう意味ですか。..マップ – Heggi
Thanks @Christopher Martin ... – Heggi