我正在尝试让程序工作,我在0到1之间生成1,000,000个随机数,然后查找并打印最大数字。
我已经让生成器工作并设法将生成的每个double插入到ArrayList中,但我似乎无法弄清楚如何在列表中找到最大的数字。目前,当前代码抛出错误“java.lang.IndexOutOfBoundsException”。
这可能是因为我是ArrayList的新手并且不熟悉它的命令以及它是如何工作的但是我真的很感激我在这里做错了一些帮助因为我已经被困了一段时间
import java.util.ArrayList;
import java.util.Random;
public class milran {
public static void main(String[] args) {
Random r = new Random();
ArrayList<Double> myList = new ArrayList<Double>();
for (int i = 1; i<=1000000; i++){
double randomValue = 0.0+(1.0-0.0)*r.nextDouble();
myList.add(randomValue);
}
double max = myList.get(1);
for (int z=2; z<=myList.size(); z++){
double test = myList.get(z);
if (test>max){
max = test;
}
}
System.out.println(max);
}
}
答案 0 :(得分:3)
首先来看看java.util.Collections和java.util.ArrayList的文档。 其次,由此...
触发ArrayIndexOutOfBoundsExceptionfor (int z=2; z<=myList.size(); z++){
double test = myList.get(z);
...
}
这是因为数组索引从0开始,因此最后一个元素是myList.size() - 1 。换句话说,当z = myList.size()
时,它超出界限。
此外,在您的第一个for
循环中,您正在使用i = 1; 1 <= 1000000
。使用i = 0; i < 1000000
更有意义,因为您可以使用i
来触摸数组(或列表)中的每个元素。
for( i = 0; i < 1000000; i++ )
{
// do something with myArray[i]
}
以下是插入值后我会做的事情......
Collections.sort(myList);
System.out.println( myList.get( myList.size() - 1 ) );
......就是这样。
如果您需要自己实现实际排序,那么我会考虑使用原始双数组(double[]
)而不是集合。
否则,如果您正在使用集合,则可以使用foreach循环。
for( Double d : myList ) // for each Double 'd' in myList
{
// do something with d
}
N.B。第二个循环中此行的另一个潜在问题
double test = myList.get(z);
从Double
(对象)到double
(基元)的自动转换称为unboxing。 将成为性能成本,特别是重复一百万次时。在第一个循环中,您将转换另一种方式(自动装箱) - 也是一百万次。
答案 1 :(得分:0)
ArrayList
从0
开始计算其元素。您需要将myList.get(1)
替换为myList.get(0)
,将int z=2
替换为int z=1
,将z<=myList.size()
替换为z<myList.size()
。
答案 2 :(得分:0)
这一行:for (int z=2; z<=myList.size(); z++) {
错了。它应该是for (int z=1; z<myList.size(); z++) {
。
这是因为数组和列表是基于0的,所以大小为2的列表有2个元素 - 索引0和索引1.目前你尝试索引的元素数等于大小,这是不存在的。
同一行,myList.get(1);
应为myList.get(0);
。
这与您的问题无关,但此行0.0+(1.0-0.0)*r.nextDouble();
可以更轻松地写为r.nextDouble();
。做0 + 1 - 0,我不确定你要做什么。
答案 3 :(得分:0)
正如其他人已经指出的那样,你的for循环条件中有一个错误导致索引超出范围。
将来可以避免这种情况的一种方法是使用Java for-each循环语法,而不是尝试自己管理索引。
for (Double test : myList) {
if (test>max){
max = test;
}
}
此语法使您的意图比传统的索引for
语法更清晰,并从您的手中删除潜在错误点(管理索引和列表的边界)。