如何通过分配比预期更多的值的Hashmap <int <arraylist >>修复循环

时间:2019-01-15 13:07:44

标签: java arraylist hashmap

预先感谢您的宝贵时间! 我正在研究Fruchterman Reingold Graph的创建者,并且陷入了一个似乎很简单的问题。长话短说,我想初始化一个Hashmap,其中包含一个Integer键,即我所在的顶点,以及一个x位置和y位置的整数列表。但是,以下代码将每个键放置8个而不是2个位置值,而不是2个。任何帮助或提示,我们将不胜感激!

package testing.ground;

import java.util.*;


public class TestingGround {


public static void main(String[] args) {


    Random ranx = new Random();
    Random rany = new Random();
    HashMap<Integer,List<Integer>> positions=new HashMap<Integer,List<Integer>>();
    List<Integer> temp = new ArrayList<Integer>();

    int n = 3;
    int area = 1280*720;
    int vposx=0;
    int vposy=0;


    double k = 0.5*(Math.sqrt(area/n));
    for (int i=0; i<=n; i++){
        vposx=ranx.nextInt(1280)+1;
        vposy=rany.nextInt(720)+1;
        temp.add(vposx);
        temp.add(vposy);
        positions.put(i,temp);

    }
        System.out.println(positions);
}
}

结果就是这些

  

{0 = [1063,102,41,391,614,418,751,599],1 = [1063,102,41,391,614,418,751,599],2 = [1063,102 ,41,391,614,418,751,599],3 = [1063,102,41,391,614,418,751,599]}

期望的只是0=[randomx,randomy], 2=[randomx,randomy] and so on

2 个答案:

答案 0 :(得分:5)

您应该为ArrayList的每个值创建一个新的Map

for (int i=0; i<=n; i++){
    List<Integer> temp = new ArrayList<>();
    vposx=ranx.nextInt(1280)+1;
    vposy=rany.nextInt(720)+1;
    temp.add(vposx);
    temp.add(vposy);
    positions.put(i,temp);
}

否则,您会将Map中的所有键与相同的值List关联。

答案 1 :(得分:0)

导入java.util。*;

公共类SomeTestingClass {

public static void main(String [] args){

Random ranx = new Random();
Random rany = new Random();
HashMap<Integer,List<Integer>> positions=new HashMap<Integer,List<Integer>>();
List<Integer> temp = null;

int n = 3;
int area = 1280*720;
int vposx=0;
int vposy=0;


double k = 0.5*(Math.sqrt(area/n));
for (int i=0; i<=n; i++){
    vposx=ranx.nextInt(1280)+1;
    vposy=rany.nextInt(720)+1;
    **temp=new ArrayList<Integer>();** // this will solve your problem
    temp.add(vposx);
    temp.add(vposy);
    positions.put(i,temp);

}
    System.out.println(positions);

} }