两个映射值java的总和

时间:2015-12-19 08:54:17

标签: java dictionary

如何汇总两个不同地图中的所有值?

Map<String, List<String>> map = new HashMap<String, List<String>>();
List<String> totalValOne= new ArrayList<String>();
List<String> totalValTwo= new ArrayList<String>();
map1.put("totalPriceSet1", totalValOne);     
map2.put("totalPriceSet2", totalValTwo);

我得到了所有的值

String PriceValues1 = "";
for (int i = 0; i < map1.size(); i++) {
    System.out.println(map1.size());
    for (List<String> value : map1.values()) {

        for (String tot : value) {
            PriceValues1 = tot;
            System.out.println("values.....  "+ tot);
        }
    }
    //--------

String PriceValues2 = "";
for (int i = 0; i < map2.size(); i++) {
    System.out.println(map2.size());
    for (List<String> value : map2.values()) {

        for (String tot : value) {
            PriceValues2 = tot;
            System.out.println("values.....  "+ tot);
        }
    }

我正在尝试逐个添加两个地图的值。

例如:

totalPriceSet1 {1,2,3,4}
totalPriceSet2 {2,3,4,5}

我希望两者的总和为

Sum {3,5,7,9}

4 个答案:

答案 0 :(得分:0)

你能做的是:

 public static void main( String[] args ){
        Map<String, Integer> map = new TreeMap<>();
        map.put( "total1", 2 );
        map.put( "total2", 3 );

        Map<String, Integer> map2 = new TreeMap<>();
        map2.put( "otherTotal1", 1 );
        map2.put( "otherTotal2", 2 );

        System.out.println( sumMaps( map, map2 ) );
    }

    private static List<Integer> sumMaps( Map<String, Integer>... maps ){
        List<Integer> result = new ArrayList<>();
        for( Map<String, Integer> map : maps ){
            List<Integer> list = new ArrayList<Integer>( map.values() );

            for( int i = 0; i < list.size(); i++ ){
                if( indexExists( result, i ) ){
                    // sums up existing and new value
                    Integer oldValue = result.get( i );
                    Integer newValue = oldValue + list.get( i );
                    result.remove( i );
                    result.add( i, newValue );
                }
                else{
                    // no existing value
                    result.add( list.get( i ) );
                }
            }
        }

        return result;
    }

    private static boolean indexExists( List<Integer> list, int index ){
        return index >= 0 && index < list.size();
    }

我使用Map<String,Integer>制作,您可以更改String -> String或任何您想要的内容。

输出:

[3, 5]

答案 1 :(得分:0)

请注意,如果值在HashMap中,则排序几乎是随机的。 LinkedHashMapTreeMap有明确定义的排序。

如果地图尺寸不一样怎么办?我在这里假设您只想要单个值。

最好的方法是并行迭代这两张地图。这样就不会复制任何内容,每个地图只会迭代一次。

private static List<Integer> sumMapValues(Map<?, Integer> map1, Map<?, Integer> map2) {
    Iterator<Integer> iter1 = map1.values().iterator();
    Iterator<Integer> iter2 = map2.values().iterator();
    List<Integer> sum = new ArrayList<>();
    while (iter1.hasNext() || iter2.hasNext()) {
        if (! iter2.hasNext())
            sum.add(iter1.next());
        else if (! iter1.hasNext())
            sum.add(iter2.next());
        else
            sum.add(iter1.next() + iter2.next());
    }
    return sum;
}

测试

Map<String, Integer> map1 = new LinkedHashMap<>();
map1.put("a", 1);
map1.put("b", 2);
map1.put("c", 3);
map1.put("d", 4);
Map<String, Integer> map2 = new LinkedHashMap<>();
map2.put("x", 2);
map2.put("y", 3);
map2.put("z", 4);
System.out.println(map1);
System.out.println(map2);
System.out.println(sumMapValues(map1, map2));

输出

{a=1, b=2, c=3, d=4}
{x=2, y=3, z=4}
[3, 5, 7, 4]

答案 2 :(得分:0)

我做的是,

    private static List<Integer> sumValue(Map<String, List<Integer>> map1,
                                 Map<String, List<Integer>> map2) 
{
        List<Integer> priceValues1Int = new ArrayList<Integer>();
        List<Integer> priceValues2Int = new ArrayList<Integer>();
        List<Integer> sum = new ArrayList<Integer>();
        for (List<Integer> integer : map1.values()) {
            priceValues1Int = integer;
        }
        for (List<Integer> integer2 : map2.values()) {
            priceValues2Int = integer2;
        }
        for(int i=0; i<priceValues1Int .size(); i++){
            int sum1 =  priceValues1Int .get(i)+priceValues2Int .get(i);
            sum.add(sum1);
        }
    return sum;
}

答案 3 :(得分:-1)

问题在于列表,而不是地图。要合并两个列表,例如:

public static void main(String... args) {

    // Example
    List<Integer> listA = new ArrayList<>();
    listA.add(1);
    listA.add(2);
    listA.add(3);
    listA.add(4);

    Map<String, List<Integer>> map1 = new HashMap<>();

    map1.put("totalPriceSet1", listA);

    List<Integer> listB = new ArrayList<>();
    listB.add(2);
    listB.add(3);
    listB.add(4);
    listB.add(5);

    Map<String, List<Integer>> map2 = new HashMap<>();
    map2.put("totalPriceSet2", listB);

    // Sum
    List<Integer> sum = sum(map1.get("totalPriceSet1"), map2.get("totalPriceSet2"));

    // Put in third map if you want
    Map<String, List<Integer>> map3 = new HashMap<>();
    map3.put("sum", sum);

    // Output
    System.out.println(map3.get("sum").stream().map(Object::toString).collect(Collectors.joining(",", "{", "}")));

}

public static List<Integer> sum(List<Integer> listA, List<Integer> listB) {
    List<Integer> result = new ArrayList<>();

    Iterator<Integer> iteratorA = listA.iterator();
    Iterator<Integer> iteratorB = listB.iterator();

    while (iteratorA.hasNext() && iteratorB.hasNext()) {
        result.add(iteratorA.next() + iteratorB.next());
    }

    return result;
}