【问题标题】:HashMap storing same values for all KeysHashMap 为所有键存储相同的值
【发布时间】:2017-04-13 19:32:45
【问题描述】:

我想为唯一坐标存储不同的值。我使用整数数组将 HashMap 中的这些值存储到相应的坐标,但每个键都映射到最后计算的值。

代码:

import java.util.*;
import java.awt.Point;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Solution
{

@SuppressWarnings("empty-statement")
public static void main(String[] args)
{
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int m = in.nextInt();

    Integer[] ar = new Integer[3];

    Map<Point, Integer[]> map = new HashMap<>();

    for (int a0 = 0; a0 < m; a0++) {

        Point p = new Point(in.nextInt(), in.nextInt());
        int a = in.nextInt();
        int b = in.nextInt();

        if (map.containsKey(p)) {

            if (map.get(p)[2] < (a - b)) {
                ar[0] = a;
                ar[1] = b;
                ar[2] = a - b;
                map.put(p, ar);
            }
        } else {
            ar[0] = a;
            ar[1] = b;
            ar[2] = a - b;
            map.put(p, ar);
        }

    }
    Set<Entry<Point, Integer[]>> set = map.entrySet();
    List<Entry<Point, Integer[]>> list = new ArrayList<>(set);


    for (Map.Entry<Point, Integer[]> entry : list)
        System.out.println(entry.getKey() + " ==== " + Arrays.toString(entry.getValue()));



}
}

输入:

3 3

0 1 1 1

1 2 2 4

2 0 1 2

结果:

java.awt.Point[x=0,y=1] ==== [1, 2, -1]

java.awt.Point[x=1,y=2] ==== [1, 2, -1]

java.awt.Point[x=2,y=0] ==== [1, 2, -1]

【问题讨论】:

  • 每次都需要新建一个数组。
  • 对,map.put 会在存在键时覆盖任何数据
  • @Lashane 虽然这不是这里的问题。它总是相同的数组实例。
  • @Marvin 啊,还有 :)
  • 有没有其他方法可以做到这一点,而无需每次都创建新数组? @马文

标签: java-8 hashmap


【解决方案1】:

您的ar 数组只有一个实例,而且您只是将它存储在多个键下。每次都需要创建一个新的数组实例:

import java.awt.Point;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class Solution {

    public static void main(String[] args) {
        try (Scanner in = new Scanner(System.in)) {
            int n = in.nextInt();
            int m = in.nextInt();

            Map<Point, Integer[]> map = new HashMap<>();

            for (int a0 = 0; a0 < m; a0++) {

                Point p = new Point(in.nextInt(), in.nextInt());
                int a = in.nextInt();
                int b = in.nextInt();
                // New array for each key
                Integer[] ar = new Integer[3];

                if (map.containsKey(p)) {

                    if (map.get(p)[2] < (a - b)) {
                        ar[0] = a;
                        ar[1] = b;
                        ar[2] = a - b;
                        map.put(p, ar);
                    }
                } else {
                    ar[0] = a;
                    ar[1] = b;
                    ar[2] = a - b;
                    map.put(p, ar);
                }

            }
            Set<Entry<Point, Integer[]>> set = map.entrySet();
            List<Entry<Point, Integer[]>> list = new ArrayList<>(set);

            for (Map.Entry<Point, Integer[]> entry : list)
                System.out.println(entry.getKey() + " ==== " + Arrays.toString(entry.getValue()));

        }
    }
}

输出:

java.awt.Point[x=0,y=1] ==== [1, 1, 0]
java.awt.Point[x=1,y=2] ==== [2, 4, -2]
java.awt.Point[x=2,y=0] ==== [1, 2, -1]

(另请注意,n 实际上并没有在任何地方读取。)

为了更好地理解,请考虑以下简化示例:

import java.util.HashMap;
import java.util.Map;

public class SimpleSolution {

    public static void main(String[] args) {
        Map<Integer, Integer[]> map = new HashMap<>();
        Integer[] arr = new Integer[1];

        arr[0] = 1;
        map.put(1, arr);
        System.out.println(map);
        System.out.println(map.get(1)[0]);
        arr[0] = 2;
        map.put(2, arr);
        System.out.println(map);
        System.out.println(map.get(1)[0]);
    }
}

输出:

{1=[Ljava.lang.Integer;@2a139a55}
1
{1=[Ljava.lang.Integer;@2a139a55, 2=[Ljava.lang.Integer;@2a139a55}
2

你在这里看到的是

  1. 键 1 和键 2 都具有相同的数组引用
  2. arr[0]设置为2后,map中key 1的值也发生了变化

【讨论】:

  • 谢谢@Marvin
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 2015-11-22
  • 2013-10-16
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2015-09-15
  • 2012-06-18
相关资源
最近更新 更多