PowerShell, как добавить что-то на анализ JSON?

Вдохновленный ответом GETah Я решил написать что-то подобное себе с некоторыми улучшениями:

  • Класс реализует Map -Interface
  • Двунаправленность действительно гарантируется, если позаботиться об этом при изменении значения на put (по крайней мере, я надеюсь это гарантировать)

Использование подобно обычной карте , чтобы получить обратный вид на картографический вызов getReverseView(). Содержимое не копируется, возвращается только представление.

Я не уверен, что это абсолютно безупречно (на самом деле это, вероятно, нет), поэтому не стесняйтесь комментировать, если вы заметили какие-то недостатки и я 'll обновить ответ.

public class BidirectionalMap implements Map {

    private final Map map;
    private final Map revMap;

    public BidirectionalMap() {
        this(16, 0.75f);
    }

    public BidirectionalMap(int initialCapacity) {
        this(initialCapacity, 0.75f);
    }

    public BidirectionalMap(int initialCapacity, float loadFactor) {
        this.map = new HashMap<>(initialCapacity, loadFactor);
        this.revMap = new HashMap<>(initialCapacity, loadFactor);
    }

    private BidirectionalMap(Map map, Map reverseMap) {
        this.map = map;
        this.revMap = reverseMap;
    }

    @Override
    public void clear() {
        map.clear();
        revMap.clear();
    }

    @Override
    public boolean containsKey(Object key) {
        return map.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return revMap.containsKey(value);
    }

    @Override
    public Set> entrySet() {
        return Collections.unmodifiableSet(map.entrySet());
    }

    @Override
    public boolean isEmpty() {
        return map.isEmpty();
    }

    @Override
    public Set keySet() {
        return Collections.unmodifiableSet(map.keySet());
    }

    @Override
    public void putAll(Map m) {
        m.entrySet().forEach(e -> put(e.getKey(), e.getValue()));
    }

    @Override
    public int size() {
        return map.size();
    }

    @Override
    public Collection values() {
        return Collections.unmodifiableCollection(map.values());
    }

    @Override
    public Value get(Object key) {
        return map.get(key);
    }

    @Override
    public Value put(Key key, Value value) {
        Value v = remove(key);
        getReverseView().remove(value);
        map.put(key, value);
        revMap.put(value, key);
        return v;
    }

    public Map getReverseView() {
        return new BidirectionalMap<>(revMap, map);
    }

    @Override
    public Value remove(Object key) {
        if (containsKey(key)) {
            Value v = map.remove(key);
            revMap.remove(v);
            return v;
        } else {
            return null;
        }
    }

}

17
задан YS-L 18 May 2014 в 09:26
поделиться