From: "Enrico Weigelt, metux IT consult" <enrico.weig...@gr13.net>
This map type eases accumulation of key->integer and key-double tuples by key, w/o the ovead of streams and callacks to BinaryOperator objects. --- .../gui/panel/report/ReportCompactColonyPanel.java | 35 ++++------ .../sf/freecol/common/util/CollectionUtils.java | 8 --- src/net/sf/freecol/common/util/DoubleAccMap.java | 75 ++++++++++++++++++++++ src/net/sf/freecol/common/util/IntAccMap.java | 75 ++++++++++++++++++++++ 4 files changed, 163 insertions(+), 30 deletions(-) create mode 100644 src/net/sf/freecol/common/util/DoubleAccMap.java create mode 100644 src/net/sf/freecol/common/util/IntAccMap.java diff --git a/src/net/sf/freecol/client/gui/panel/report/ReportCompactColonyPanel.java b/src/net/sf/freecol/client/gui/panel/report/ReportCompactColonyPanel.java index a987560ec43..e9b87d002ef 100644 --- a/src/net/sf/freecol/client/gui/panel/report/ReportCompactColonyPanel.java +++ b/src/net/sf/freecol/client/gui/panel/report/ReportCompactColonyPanel.java @@ -71,6 +71,8 @@ import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.model.WorkLocation; import net.sf.freecol.common.model.WorkLocation.Suggestion; import net.sf.freecol.common.resources.ResourceManager; +import net.sf.freecol.common.util.IntAccMap; +import net.sf.freecol.common.util.DoubleAccMap; import static net.sf.freecol.common.util.CollectionUtils.*; @@ -860,46 +862,35 @@ public final class ReportCompactColonyPanel extends ReportPanel "newline, span, growx"); // Accumulate all the summaries - Map<Region, Integer> rRegionMap = new HashMap<>(); + IntAccMap<Region> rRegionMap = new IntAccMap<>(); List<TileImprovementSuggestion> rTileSuggestions = new ArrayList<>(); int rFamine = 0, rBonus = 0, rSizeChange = 0, teacherLen = 0, improveLen = 0; double rNewColonist = 0.0; Map<GoodsType, ColonySummary.GoodsProduction> rProduction = new HashMap<>(); - Map<UnitType, Integer> rTeachers = new HashMap<>(); + IntAccMap<UnitType> rTeachers = new IntAccMap<>(); List<Unit> rNotWorking = new ArrayList<>(); List<UnitType> rCouldWork = new ArrayList<>(); - Map<UnitType, Integer> rImprove = new HashMap<>(); - Map<GoodsType, Double> rNeeded = new HashMap<>(); + IntAccMap<UnitType> rImprove = new IntAccMap<>(); + DoubleAccMap<GoodsType> rNeeded = new DoubleAccMap<>(); for (ColonySummary s : summaries) { - accumulateToMap(rRegionMap, s.colony.getTile().getRegion(), 1, - integerAccumulator); + rRegionMap.inc(s.colony.getTile().getRegion()); rTileSuggestions.addAll(s.tileSuggestions); if (s.famine) rFamine++; if (s.newColonist > 0) rNewColonist += s.newColonist; rBonus += s.bonus; rSizeChange += s.sizeChange; - accumulateMap(rProduction, s.production, - ColonySummary.goodsProductionAccumulator); + ColonySummary.accumulateGoodsProduction(rProduction, s.production); teacherLen = Math.max(teacherLen, s.teachers.size()); - for (Unit u : s.teachers.keySet()) { - accumulateToMap(rTeachers, u.getType(), 1, integerAccumulator); - } + for (Unit u : s.teachers.keySet()) rTeachers.inc(u.getType()); rNotWorking.addAll(s.notWorking); rCouldWork.addAll(s.couldWork); improveLen = Math.max(improveLen, s.improve.size() + s.want.size()); - for (UnitType ut : s.improve.keySet()) { - accumulateToMap(rImprove, ut, 1, integerAccumulator); - } - for (UnitType ut : s.want.keySet()) { - accumulateToMap(rImprove, ut, 1, integerAccumulator); - } - if (s.needed != null && s.needed.getType().isStorable()) { - accumulateToMap(rNeeded, s.needed.getType(), - (double)s.needed.getAmount() / s.completeTurns, - doubleAccumulator); - } + for (UnitType ut : s.improve.keySet()) rImprove.inc(ut); + for (UnitType ut : s.want.keySet()) rImprove.inc(ut); + if (s.needed != null && s.needed.getType().isStorable()) + rNeeded.addDouble(s.needed.getType(), (double)s.needed.getAmount() / s.completeTurns); } rNewColonist = Math.round(rNewColonist / summaries.size()); diff --git a/src/net/sf/freecol/common/util/CollectionUtils.java b/src/net/sf/freecol/common/util/CollectionUtils.java index 7f911e72ad8..1a265516d81 100644 --- a/src/net/sf/freecol/common/util/CollectionUtils.java +++ b/src/net/sf/freecol/common/util/CollectionUtils.java @@ -58,14 +58,6 @@ public class CollectionUtils { private static final double SUM_DOUBLE_DEFAULT = 0.0; private static final double PRODUCT_DEFAULT = 1.0; - /** Trivial integer accumulator. */ - public static final BinaryOperator<Integer> integerAccumulator - = (i1, i2) -> i1 + i2; - - /** Trivial double accumulator. */ - public static final BinaryOperator<Double> doubleAccumulator - = (d1, d2) -> d1 + d2; - public static final BinaryOperator<Double> doubleMultiplicator = new BinaryOperator<Double>() { public Double apply(Double d1, Double d2) { diff --git a/src/net/sf/freecol/common/util/DoubleAccMap.java b/src/net/sf/freecol/common/util/DoubleAccMap.java new file mode 100644 index 00000000000..258b9e9d154 --- /dev/null +++ b/src/net/sf/freecol/common/util/DoubleAccMap.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2002-2017 The FreeCol Team + * + * This file is part of FreeCol. + * + * FreeCol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * FreeCol 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. + */ + +package net.sf.freecol.common.util; + +import java.util.HashMap; +import java.util.Map; + +public class DoubleAccMap<T> extends HashMap<T,Double> +{ + public double inc(T key) { + return addDouble(key, 1); + } + + public double addDouble(T key, double value) { + if (!containsKey(key)) { + put(key, value); + return value; + } + + Double oldval = get(key); + if (oldval == null) { + put(key, value); + return value; + } + + double newval = oldval + value; + put(key, newval); + return newval; + } + + public double mulDouble(T key, double value) { + if (!containsKey(key)) { + put(key, value); + return value; + } + + Double oldval = get(key); + if (oldval == null) { + put(key, value); + return value; + } + + double newval = oldval * value; + put(key, newval); + return newval; + } + + public double getDouble(T key) { + if (!containsKey(key)) + return 0; + + Double val = get(key); + if (val == null) + return 0; + + return val; + } +} diff --git a/src/net/sf/freecol/common/util/IntAccMap.java b/src/net/sf/freecol/common/util/IntAccMap.java new file mode 100644 index 00000000000..5325c38058f --- /dev/null +++ b/src/net/sf/freecol/common/util/IntAccMap.java @@ -0,0 +1,75 @@ +/** + * Copyright (C) 2002-2017 The FreeCol Team + * + * This file is part of FreeCol. + * + * FreeCol is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * FreeCol 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. + */ + +package net.sf.freecol.common.util; + +import java.util.HashMap; +import java.util.Map; + +public class IntAccMap<T> extends HashMap<T,Integer> +{ + public int inc(T key) { + return addInt(key, 1); + } + + public int addInt(T key, int value) { + if (!containsKey(key)) { + put(key, value); + return value; + } + + Integer oldval = get(key); + if (oldval == null) { + put(key, value); + return value; + } + + int newval = oldval + value; + put(key, newval); + return newval; + } + + public int mulInt(T key, int value) { + if (!containsKey(key)) { + put(key, value); + return value; + } + + Integer oldval = get(key); + if (oldval == null) { + put(key, value); + return value; + } + + int newval = oldval * value; + put(key, newval); + return newval; + } + + public int getInt(T key) { + if (!containsKey(key)) + return 0; + + Integer val = get(key); + if (val == null) + return 0; + + return val; + } +} -- 2.11.0.rc0.7.gbe5a750 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Freecol-developers mailing list Freecol-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/freecol-developers