/* Copyright 2008-2010 Gephi Authors : Cezary Bartosiak Website : http://www.gephi.org This file is part of Gephi. Gephi is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Gephi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Gephi. If not, see <http://www.gnu.org/licenses/>. */ package org.gephi.data.attributes.type; import java.util.Hashtable; import java.util.List; import org.gephi.data.attributes.api.Estimator; /** * Represents {@link String} type which can have got different values in * different time intervals. * * @author Cezary Bartosiak */ public final class DynamicString extends DynamicType<String> { /** * Constructs a new {@code DynamicType} instance with no intervals. */ public DynamicString() { super(); } /** * Constructs a new {@code DynamicType} instance that contains a given * {@code Interval<T>} in. * * @param in interval to add (could be null) */ public DynamicString(Interval<String> in) { super(in); } /** * Constructs a new {@code DynamicType} instance with intervals given by * {@code List<Interval<T>>} in. * * @param in intervals to add (could be null) */ public DynamicString(List<Interval<String>> in) { super(in); } /** * Constructs a deep copy of {@code source}. * * @param source an object to copy from (could be null, then completely new * instance is created) */ public DynamicString(DynamicString source) { super(source); } /** * Constructs a deep copy of {@code source} that contains a given * {@code Interval<T>} in. * * @param source an object to copy from (could be null, then completely new * instance is created) * @param in interval to add (could be null) */ public DynamicString(DynamicString source, Interval<String> in) { super(source, in); } /** * Constructs a deep copy of {@code source} that contains a given * {@code Interval<T>} in. Before add it removes from the newly created * object all intervals that overlap with a given {@code Interval<T>} out. * * @param source an object to copy from (could be null, then completely new * instance is created) * @param in interval to add (could be null) * @param out interval to remove (could be null) */ public DynamicString(DynamicString source, Interval<String> in, Interval<String> out) { super(source, in, out); } /** * Constructs a deep copy of {@code source} with additional intervals * given by {@code List<Interval<T>>} in. * * @param source an object to copy from (could be null, then completely new * instance is created) * @param in intervals to add (could be null) */ public DynamicString(DynamicString source, List<Interval<String>> in) { super(source, in); } /** * Constructs a deep copy of {@code source} with additional intervals * given by {@code List<Interval<T>>} in. Before add it removes from the * newly created object all intervals that overlap with intervals given by * {@code List<Interval<T>>} out. * * @param source an object to copy from (could be null, then completely new * instance is created) * @param in intervals to add (could be null) * @param out intervals to remove (could be null) */ public DynamicString(DynamicString source, List<Interval<String>> in, List<Interval<String>> out) { super(source, in, out); } @Override public String getValue(Interval interval, Estimator estimator) { List<String> values = getValues(interval); if (values.isEmpty()) return null; switch (estimator) { case AVERAGE: throw new UnsupportedOperationException( "Not supported estimator"); case MEDIAN: if (values.size() % 2 == 1) return values.get(values.size() / 2); return values.get(values.size() / 2 - 1); case MODE: Hashtable<Integer, Integer> map = new Hashtable<Integer, Integer>(); for (int i = 0; i < values.size(); ++i) { int prev = 0; if (map.containsKey(values.get(i).hashCode())) prev = map.get(values.get(i).hashCode()); map.put(values.get(i).hashCode(), prev + 1); } int max = map.get(values.get(0).hashCode()); int index = 0; for (int i = 1; i < values.size(); ++i) if (max < map.get(values.get(i).hashCode())) { max = map.get(values.get(i).hashCode()); index = i; } return values.get(index); case SUM: throw new UnsupportedOperationException( "Not supported estimator"); case MIN: String minimum = values.get(0); for (int i = 1; i < values.size(); ++i) if (minimum.compareTo(values.get(i)) > 0) minimum = values.get(i); return minimum; case MAX: String maximum = values.get(0); for (int i = 1; i < values.size(); ++i) if (maximum.compareTo(values.get(i)) < 0) maximum = values.get(i); return maximum; case FIRST: return values.get(0); case LAST: return values.get(values.size() - 1); default: throw new IllegalArgumentException("Unknown estimator."); } } @Override public Class getUnderlyingType() { return String.class; } }