Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这个for循环的大小是我的ArrayList的两倍?_Java_Loops_For Loop - Fatal编程技术网

Java 为什么这个for循环的大小是我的ArrayList的两倍?

Java 为什么这个for循环的大小是我的ArrayList的两倍?,java,loops,for-loop,Java,Loops,For Loop,这是一个家庭作业 我会提示用户输入任意数量的数字,后跟一个单词。因为我不知道要输入的数字量,所以我将它们存储在字符串[]中,然后将它们移动到ArrayList中。 通过在空白处拆分扫描仪输入,我将输入正确地存储到字符串[]中 现在,我尝试将字符串[]的内容添加到ArrayList中,如下所示: int i = 0; for ( i = 0; i < inputToStringArray.length; i++) { if(values.add(Doubl

这是一个家庭作业

我会提示用户输入任意数量的数字,后跟一个单词。因为我不知道要输入的数字量,所以我将它们存储在字符串[]中,然后将它们移动到ArrayList中。 通过在空白处拆分扫描仪输入,我将输入正确地存储到字符串[]中

现在,我尝试将字符串[]的内容添加到ArrayList中,如下所示:

    int i = 0;

    for ( i = 0; i < inputToStringArray.length; i++) { 
        if(values.add(Double.parseDouble(inputToStringArray[i]))){  //if you can parse a double, parse a double
            values.add(Double.parseDouble(inputToStringArray[i]));
        }
    }
因为我不希望单词出现在输入的末尾,所以我正在分析字符串[]的双精度。 问题是,ArrayList复制每个数字,连续存储两次。 输入值1、2.2、3.3将存储为1.0、1.0、2.2、2.2、3.3、3.3

为什么?

基本上,如果Listadd返回true,您将再次添加它

if(values.add(Double.parseDouble(inputToStringArray[i]))){  //if you can parse a double, parse a double
    values.add(Double.parseDouble(inputToStringArray[i]));
}
基本上是说

if add(value) { 
    add(value) // again...
}
类似于

for ( i = 0; i < inputToStringArray.length; i++) { 
    try {
        values.add(Double.parseDouble(inputToStringArray[i]));
    } catch (NumberFormatException exp) {
        System.err.println(inputToStringArray[i] + " is not a valid double");
    }
}

可能会更好…

因为您添加了两次!If语句试图将其添加到值中,如果成功,则再次添加

试着这样做:

int i = 0;

for ( i = 0; i < inputToStringArray.length; i++) { 
    try {
        values.add(Double.parseDouble(inputToStringArray[i]));
    } catch (NumberFormatException e) {
        // not a number!
        e.printStackTrace();
    }

}
for ( int i = 0; i < inputToStringArray.length; i++) {
    try {
        values.add(Double.parseDouble(inputToStringArray[i]));   
    } catch (NumberFormatException e){} 
}

a实际上,您可以调用方法values.add两次,在if子句中不需要它

b如果字符串值不是数字,您可能会遇到异常,您应该捕捉到这一点

您应该使用如下内容:

int i = 0;

for ( i = 0; i < inputToStringArray.length; i++) { 
    try {
        values.add(Double.parseDouble(inputToStringArray[i]));
    } catch (NumberFormatException e) {
        // not a number!
        e.printStackTrace();
    }

}
for ( int i = 0; i < inputToStringArray.length; i++) {
    try {
        values.add(Double.parseDouble(inputToStringArray[i]));   
    } catch (NumberFormatException e){} 
}

因为这是您在代码中输入的内容。你有values.add两次。我的代码没有bug,它完全按照我编写的itList运行。add总是返回true。我看到了我的错误。非常感谢你!将在我的hw中引用此答案。@Davidermann我在讨论更多关于if语句的状态,然后是列表的要求和此上下文您的评论是正确的,但是如果列表实现未知,如果列表实现由于某种原因无法添加元素,则可能返回false…只是说…不,返回true。如果没有,那就是有人做错了什么。如果返回false,则没有任何意义,因为这是一个未定义的行为。@Davidermann它不是未定义的,Collectionsadd clear定义它。Return:true如果此集合因调用而更改-这意味着如果它返回false,则列表不会因调用而更改,这表明无法添加该项,但这是实现细节-ArrayList将始终返回true,其编码方式是这样的,或者抛出OutOfMemoryException,因为它无法调整其内部缓存的大小。。。;