【问题标题】:Populate an array of objects using hashmap使用 hashmap 填充对象数组
【发布时间】:2016-08-31 21:59:33
【问题描述】:

我是 hashmap 的新手,即使我试图阅读它,我也无法真正解决我的问题。

这是我遇到此问题的代码部分。

public HeatmapData(HashMap<Node, ArrayList<ODData>> ODs)
{
    /* get all of the origins */
    Node [] row = ODs.keySet().toArray(new Node[0]);
    Node [] column = new Node[row.length];
    System.arraycopy(row, 0, column, 0, row.length);

    ODData [] routes = new ODData[ROUTES_SIZE];     

    for (int i=0; i<ROUTES_SIZE; i++)
    {
        ODData temp = new ODData();
        // Node n = row[i];

        routes[i] = temp;

        //routes = (ODData[]) ODs.get(n).toArray(new ODData[0]);            
    }

如您所见,我真的找不到将数据从原始哈希映射复制到我的对象数组的方法。

我基本上需要找到数组“row”中的第一个节点,从 hashmpap 中找到它的值,填充我的数组“routes[]”,然后对数组“row”中的第二个节点执行相同的操作。似乎每次我尝试都会错过匹配错误或空值。

程序读取两个文件,如下所示:

第一:

100001 200002 6
100001 200003 9
...............

第二:

100001 -97.5489 30.5846
100002 -97.6958 30.5986
...............

我的节点类由

int ID;
double longititude;
double lattitude;

我的 ODData 类包括

Node origin;
Node destination;
double value;

每个 10000 号码都有很多 20000 号码与之相关。

使用发送到函数的哈希图,我需要用这些 ODData 对象填充我的 ODData routes[] 数组,使其看起来像原始文件(第一个文件)。

知道怎么做吗? 如有任何帮助,我将不胜感激!

尼基塔

【问题讨论】:

  • 你为什么有这个?新节点[0]
  • 这部分实际上工作正常。它用正确的节点填充数组“row”和“colom”。我的问题在循环中。
  • 到底是什么问题?
  • 它没有指向任何地方?循环有什么错误或问题?
  • 请发布完整的代码,您实际上想要做什么?

标签: java arrays for-loop hashmap populate


【解决方案1】:

您必须迭代哈希映射并获取映射的值,然后使用数组列表的 toArray() 将数组列表(哈希映射的值)转换为数组。但是在您的设计中,路由数组的大小有限,这会浪费内存。

公共类 FetchMapData {

static final int ROUTES_SIZE = 10;

public void HeatMap(HashMap<String, ArrayList<ODData>> map) {

    int totalLength = 0;

    ArrayList<ODData> alist = new ArrayList<ODData>();

    ODData[] routes = new ODData[ROUTES_SIZE];
    ODData[] tmpRoutes = new ODData[ROUTES_SIZE];

    for (String key : map.keySet()) {
        alist = map.get(key);
        // this will have an impact as your array size limited to
        // ROUTES_SIZE
        tmpRoutes = alist.toArray(new ODData[alist.size()]);
        System.arraycopy(tmpRoutes, 0, routes, totalLength,
                tmpRoutes.length);
        totalLength = totalLength + tmpRoutes.length;
    }
    for (int i = 0, length = routes.length; i < length; i++) {
        if (routes[i] != null) {
            System.out.println(routes[i].getOrigin() + "        "
                    + routes[i].getDestination() + "        "
                    + routes[i].getValue());
        }
    }
}

public static void main(String[] args) {
    HashMap<String, ArrayList<ODData>> heatMap = new HashMap<String, ArrayList<ODData>>();

    ArrayList<ODData> list1 = new ArrayList<ODData>();
    ArrayList<ODData> list2 = new ArrayList<ODData>();
    ODData obj1 = new ODData("s1", "s2", 1.1);
    ODData obj2 = new ODData("s3", "s4", 2.1);
    ODData obj3 = new ODData("s5", "s6", 3.1);
    ODData obj4 = new ODData("s7", "s8", 4.1);
    list1.add(obj1);
    list1.add(obj2);
    list2.add(obj3);
    list2.add(obj4);
    heatMap.put("key1", list1);
    heatMap.put("key2", list2);

    FetchMapData fetchMapDataObj = new FetchMapData();
    fetchMapDataObj.HeatMap(heatMap);
}

}

输出:

s5      s6      3.1
s7      s8      4.1
s1      s2      1.1
s3      s4      2.1

您可以根据需要将 hashmap 中的 String 修改为 Node。如果要保持排序顺序,请使用 TreeMap 而不是 HashMap。

【讨论】:

  • 这段代码完美运行!唯一的问题是,每次密钥更改时,都会从头开始分配 routes[] ,而不是从停止的地方开始分配。举个例子:100001 200002 8 100001 200003 9 100001 200004 5 ...... 然后当key变为100002时,上面的所有数据都被擦除了。
  • 我希望我能评价您的解决方案,因为它完全按照我想要的方式工作!我显然没有足够的声誉。我刚刚运行了代码,它输出了所有值,但由于某种原因,它仍然没有创建热图。当我使用调试时,它显示 routes[] 正在填充地址(ctr.ODData@52c03865 等)而不是值。我错过了什么吗?
猜你喜欢
  • 2014-07-23
  • 2013-03-10
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
相关资源
最近更新 更多