实际上,您可以在特定位置注入一个元素。因此,例如,特殊条目可以出现在迭代的第三个位置。
只是为了好玩,我想出了以下可怕的方法。而不是调整顺序,我将TreeMap
与额外的伪条目一起包装。我对它在迭代期间如何处理条目删除并不十分自信,但希望您能理解这个想法。
我应该指出,此映射将始终具有“未分配”条目,默认值为null
。如果您不想要它,可以使用类似的方法,但在添加“未分配”键时等待将entries
成员从TreeSet
切换到SillySet
。或者类似的东西。
import java.util.AbstractMap;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
final class SillyMap<K, V>
extends AbstractMap<K, V>
{
private final SillySet entries;
SillyMap(K key, int unassigned)
{
entries = new SillySet(key, unassigned);
}
@Override
public Set<Map.Entry<K, V>> entrySet()
{
return entries;
}
@Override
public V put(K key, V value)
{
if (entries.extra.getKey().equals(key))
return entries.extra.setValue(value);
else
return entries.map.put(key, value);
}
private final class SillySet
extends AbstractSet<Map.Entry<K, V>>
{
final Map<K, V> map = new TreeMap<>();
final Map.Entry<K, V> extra;
private final int unassigned;
SillySet(K key, int unassigned)
{
extra = new SimpleEntry<>(Objects.requireNonNull(key), null);
if (unassigned < 0)
throw new IllegalArgumentException();
this.unassigned = unassigned;
}
@Override
public Iterator<Map.Entry<K, V>> iterator()
{
return new Iterator<Map.Entry<K, V>>()
{
private final Iterator<Map.Entry<K, V>> i = map.entrySet().iterator();
private int index = 0;
@Override
public boolean hasNext()
{
return index < size();
}
@Override
public Map.Entry<K, V> next()
{
Map.Entry<K, V> e;
if (index == Math.min(unassigned, map.size()))
e = extra;
else
e = i.next();
++index;
return e;
}
@Override
public void remove()
{
if (index - 1 == unassigned)
throw new UnsupportedOperationException();
i.remove();
--index;
}
};
}
@Override
public int size()
{
return map.size() + 1;
}
};
public static void main(String... argv)
{
final String KEY = "unassigned";
Map<String, String> hm = new SillyMap<>(KEY, 3);
hm.put("carrot", "12");
hm.put("apple", "34");
hm.put("domboi", "912");
hm.put(KEY, "?");
hm.put("banana", "45");
hm.put("zucchini", "87");
System.out.println(hm);
}
}
map.get("unassigned")
将始终返回null
。如果参数相等,你必须返回0
。 - Louis WassermanSillyMap
,它允许在指定位置放置一个映射条目! - erickson