Java ArrayList#size()的奇数返回

Java ArrayList#size()的奇数返回,java,arraylist,random,Java,Arraylist,Random,我试图在HashMap中获得一个随机的ArrayList,当我查看HashMap中的所有ArrayList时,所有内容的大小都应该是2 当我尝试将Hashmap中的ArrayList添加到另一个列表时,就会出现问题。然后,即使HashMap中所有列表的大小都是2,它也会将大小返回为0。有人知道为什么吗 for(Point p : defensePossibilities.keySet()) System.out.println(defensePossibilities.get(p).si

我试图在
HashMap
中获得一个随机的
ArrayList
,当我查看
HashMap
中的所有ArrayList时,所有内容的大小都应该是2

当我尝试将
Hashmap
中的
ArrayList
添加到另一个列表时,就会出现问题。然后,即使
HashMap
中所有列表的大小都是2,它也会将大小返回为0。有人知道为什么吗

for(Point p : defensePossibilities.keySet())
    System.out.println(defensePossibilities.get(p).size());

ArrayList<Point> points = new ArrayList<>();
while(points == null) {
    try {
        int random = rnd.nextInt(defensePossibilities.size());
        points.addAll(
                defensePossibilities.get(random));
    } catch(Exception e) {}
}
System.out.println("PointsSize: " + points.size());

int piece2 = rnd.nextInt(points.size());

如果
HashMap
中的所有数组列表的大小都是2,为什么
点的大小是0?

点替换
点==null
。isEmpty()

points
变量不为null,因为在while循环之前为
points
变量分配了一个arraylist。我假设您要做的是在poinst列表为空时进行检查。因此,做出建议的改变将解决你的问题

for(Point p : defensePossibilities.keySet())
    System.out.println(defensePossibilities.get(p).size());

ArrayList<Point> points = new ArrayList<>();
while(points == null) { // points is not null, it is just empty
// replace points == null with points.isEmpty()
    try {
        int random = rnd.nextInt(defensePossibilities.size());
        points.addAll(
                defensePossibilities.get(random));
    } catch(Exception e) {}
}
System.out.println("PointsSize: " + points.size());

int piece2 = rnd.nextInt(points.size());
for(p点:0.keySet())
System.out.println(get.get(p.size());
ArrayList points=新的ArrayList();
虽然(points==null){//points不是null,它只是空的
//用points.isEmpty()替换points==null
试一试{
int random=rnd.nextInt(index.size());
加点(
防御可能性。获取(随机));
}捕获(例外e){}
}
System.out.println(“PointsSize:+points.size());
int piece2=rnd.nextInt(points.size());

点==null
替换为
点。isEmpty()

points
变量不为null,因为在while循环之前为
points
变量分配了一个arraylist。我假设您要做的是在poinst列表为空时进行检查。因此,做出建议的改变将解决你的问题

for(Point p : defensePossibilities.keySet())
    System.out.println(defensePossibilities.get(p).size());

ArrayList<Point> points = new ArrayList<>();
while(points == null) { // points is not null, it is just empty
// replace points == null with points.isEmpty()
    try {
        int random = rnd.nextInt(defensePossibilities.size());
        points.addAll(
                defensePossibilities.get(random));
    } catch(Exception e) {}
}
System.out.println("PointsSize: " + points.size());

int piece2 = rnd.nextInt(points.size());
for(p点:0.keySet())
System.out.println(get.get(p.size());
ArrayList points=新的ArrayList();
虽然(points==null){//points不是null,它只是空的
//用points.isEmpty()替换points==null
试一试{
int random=rnd.nextInt(index.size());
加点(
防御可能性。获取(随机));
}捕获(例外e){}
}
System.out.println(“PointsSize:+points.size());
int piece2=rnd.nextInt(points.size());

points not为空,因为您已实例化它。
arraylistpoints这是空的
因此,请替换您的代码

for(Point p : defensePossibilities.keySet())
    System.out.println(defensePossibilities.get(p).size());

ArrayList<Point> points = new ArrayList<>();
while(points.isEmpty()) {
    try {
        int random = rnd.nextInt(defensePossibilities.size());
        points.addAll(
                defensePossibilities.get(random));
    } catch(Exception e) {}
}
System.out.println("PointsSize: " + points.size());

int piece2 = rnd.nextInt(points.size());
2次更新

public V get(对象键)返回指定键所指向的值 已映射,如果此映射不包含密钥的映射,则为null

所以

ArrayList<Point> a = new ArrayList<>();
a.addAll(defensePossibilities.keySet());
int random = rnd.nextInt(defensePossibilities.size());
points.add(a.get(random))
ArrayList a=新的ArrayList();
a、 addAll(keySet());
int random=rnd.nextInt(index.size());
加分(a.get(随机))

points not为空,因为您已实例化它。
arraylistpoints这是空的
因此,请替换您的代码

for(Point p : defensePossibilities.keySet())
    System.out.println(defensePossibilities.get(p).size());

ArrayList<Point> points = new ArrayList<>();
while(points.isEmpty()) {
    try {
        int random = rnd.nextInt(defensePossibilities.size());
        points.addAll(
                defensePossibilities.get(random));
    } catch(Exception e) {}
}
System.out.println("PointsSize: " + points.size());

int piece2 = rnd.nextInt(points.size());
2次更新

public V get(对象键)返回指定键所指向的值 已映射,如果此映射不包含密钥的映射,则为null

所以

ArrayList<Point> a = new ArrayList<>();
a.addAll(defensePossibilities.keySet());
int random = rnd.nextInt(defensePossibilities.size());
points.add(a.get(random))
ArrayList a=新的ArrayList();
a、 addAll(keySet());
int random=rnd.nextInt(index.size());
加分(a.get(随机))

在使用isEmpty()而不是==null之后,实际问题是ArrayIndexOutOfBoundsException

在代码中,random的值可以与列表的大小一样大。假设里面有10个对象,随机数是10:

防御可能性。获取(随机);//10对象=索引0到9,但不是10

请记住,列表和数组一样,从0开始索引

} catch(Exception e) {
    System.out.println(e.toString());    
}

你会明白我的意思;o)

在使用isEmpty()而不是==null之后,实际问题是ArrayIndexOutOfBoundsException

在代码中,random的值可以与列表的大小一样大。假设里面有10个对象,随机数是10:

防御可能性。获取(随机);//10对象=索引0到9,但不是10

请记住,列表和数组一样,从0开始索引

} catch(Exception e) {
    System.out.println(e.toString());    
}


你会明白我的意思;o)
while(points==null)
就是这样。雷瑟曼是对的。空ArrayList从不为null,但其长度仅为0。使用isEmpty()方法而不是==null。如果它不是真的,那么它如何通过它?@TheGamerPlayz它只通过一次它不是真的。一旦该语句的计算结果为false,它就会停止重复循环。您能告诉我们如何定义这些可能性吗?它是一个HashMap吗?
while(points==null)
就是它。雷瑟曼是对的。空ArrayList从不为null,但其长度仅为0。使用isEmpty()方法而不是==null。如果它不是真的,那么它如何通过它?@TheGamerPlayz它只通过一次它不是真的。一旦该语句的计算结果为false,它就会停止重复循环。您能告诉我们如何定义这些可能性吗?这是一个HashMap吗?当我使用#isEmpty时,它会陷入一个永恒的循环中。如果有问题,你知道它是什么吗?我不知道,我必须查看你的全部代码才能找到问题。这里的代码是需要给出的所有内容。除了增加防御可能性之外,没有什么能改变这一点。当我使用时,它会陷入一个永恒的循环。如果有问题,你知道它是什么吗?我不知道,我必须查看你的全部代码才能找到问题。这里的代码是需要给出的所有内容。除了增加防御可能性之外,没有其他改变。我将其更改为#isEmpty,并且它已经在该循环中循环了850万个循环了…将points.addAll(防御可能性.get(随机))替换为points.addAll(防御可能性);我正在尝试从HashMap防御可能性的内部获取一个随机ArrayList,因此我认为这会在其自身中导致一个新的错误。好的,我现在看到了你的第二篇文章,但我并没有尝试添加所有的键或al