package ucar.coord; import java.util.*; /** * Builds one Coordinate of one Variable, * by keeping the Set of Values found in the records. * * @author caron * @since 11/27/13 */ public abstract class CoordinateBuilderImpl<T> implements CoordinateBuilder<T> { protected Set<Object> valSet = new HashSet<>(100); protected Map<Object, Integer> valMap; // map of values to index in Coordinate protected Coordinate coord; @Override public void addRecord(T gr) { Object val = extract(gr); valSet.add(val); } @Override public void addAll(Coordinate coord) { for (Object val : coord.getValues()) valSet.add(val); } public void add(Object val) { valSet.add(val); } @Override public void addAll(List<Object> coords) { for (Object val : coords) valSet.add(val); } @Override public Coordinate finish() { List<Object> valList = new ArrayList<>(valSet.size()); for (Object off : valSet) valList.add(off); coord = makeCoordinate(valList); valSet = null; List<Object> values = (List<Object>) coord.getValues(); if (values != null) { valMap = new HashMap<>(coord.getSize() * 2); for (int i = 0; i < values.size(); i++) valMap.put(values.get(i), i); } return coord; } // used by CoordinateND.makeSparseArray // not used by CoordinateTime2D @Override public int getIndex(T gr) { Integer result = valMap.get( extract(gr)); return (result == null) ? 0 : result; } @Override public Coordinate getCoordinate() { return coord; } }