All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.numenta.nupic.util.MutableNamedTuple Maven / Gradle / Ivy

package org.numenta.nupic.util;

import java.util.Collection;
import java.util.stream.IntStream;

public class MutableNamedTuple extends NamedTuple {
    /** for serialization */
    private static final long serialVersionUID = 1L;
    
    public MutableNamedTuple() {}
    
    public MutableNamedTuple(String[] keys, Object[] objects) {
        super(keys, objects);
    }

    /**
     * Sets the value at the specified index to be the
     * indicated object.
     * 
     * @param index     the index at which to set the specified object
     * @param o         the new object to store
     */
    public void put(String key, Object o) {
        if(hasKey(key)) {
            // Swap the value for the specified key in the parent Tuple container
            int containerKeyIdx = IntStream.range(0, container.length).filter(i -> container[i].equals(key)).findFirst().getAsInt();
            container[containerKeyIdx + 1] = o;
            
            // Swap the value in the hashed buckets
            int hash = hashIndex(key);
            Entry e = entries[hash].find(key, hash);
            e.value = o;
        }else{
            String[] keys = keys();
            Collection vals = values();
            String[] newKeys = new String[keys.length + 1];
            System.arraycopy(keys, 0, newKeys, 0, keys.length);
            newKeys[newKeys.length - 1] = key;
            vals.add(o);
            remake(newKeys, vals.toArray());
        }
    }
    
    /**
     * Clears the contained data from this {@code MutableTuple}
     */
    public void clear() {
        for(int i = 0;i < container.length;i++) container[i] = null;
    }
}