以下是我写的这个问题的答案 -
“现在使用ArrayList和Integer包装器类来存储值并通过使用Scanner类从控制台读取输入来初始化元素。扩展程序以识别ArrayList中的n个最大值。”
import java.util.ArrayList;
import java.util.Scanner;
public class ArraylistInput {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList<Integer> val = new ArrayList<Integer>();
Scanner in = new Scanner(System.in);
System.out.println("Enter the length of you Array List ");
int nos = in.nextInt();
// Recorrd the input numbers
for (int i = 0 ; i < nos; i++)
{
System.out.println("Enter values for the ArrayList ");
int Input = in.nextInt();
val.add(Input);
}
// Display the arraylist
for (int j = 0; j < nos; j++)
{
int x = val.get(j);
System.out.println("Index " + (j+1) + ": " + x);
}
System.out.println("How meny maximmum values do you want? ");
int max =0; // initial max value
int nmax = in.nextInt(); // number of maximum values
int length = val.size(); // size of the arraylist
// finding the maximum values in ascending order without sorting
for (int h = 1; h <= nmax ; h++)
{
for (int k=0;k < length; k++)
{
if (val.get (k) > max)
{
max = val.get(k);
}
}
System.out.println ("maximmum = " + max);
int z = val.indexOf(max); // removing the higest value after printing
val.remove(z);
}
}
}
输出和错误:
输入数组列表的长度
3
输入ArrayList的值
12
输入ArrayList的值
45
输入ArrayList的值
8
指数1:12指数2:45指数3:8
你想要多么极致的最大值?
2
maximmum = 45
线程中的异常“main”maximmum = 45 java.lang.ArrayIndexOutOfBoundsException:-1 at java.util.ArrayList.elementData(未知来源)at java.util.ArrayList.remove(未知来源)at ArraylistInput.main(ArraylistInput.java:46)
答案 0 :(得分:2)
我会做以下事情:
Collections.sort(myList, Collections.reverseOrder());
List<Integer> maxn = myList.subList(0, n);
System.out.printf("The maximum %d values are: %s%n", n, maxn);
maxn.clear(); //This clears the sublist and removes its elements from the source list
这将为您提供列表中包含最大元素的列表。
答案 1 :(得分:0)
您只有一个ArrayList,您不需要嵌套的for循环来找到最大值:
int max = Integer.MIN_VALUE;
for(int i = 0; i < list.size(); i++)
{
current = list.get(i);
if(current > max)
max = current;
}
当您搜索列表中不存在的值的最大尝试时,嵌套for循环,这就是您收到此错误的原因。
答案 2 :(得分:0)
您的max
永远不会被分配,然后您尝试从arraylist中删除不存在的元素。将max
设置为列表中不会出现的某个值,然后检查它是否已在循环中分配。
答案 3 :(得分:0)
使用以下命令从列表中删除元素时
val.remove(z);
您更改了列表的大小,但未更新length
变量。这会导致您尝试访问超出数组大小的索引,从而生成java.lang.ArrayIndexOutOfBoundsException
。
另外,请考虑同时保存最大值的索引和最大值本身。然后,当您去除该值时,您可以直接使用ArrayList.remove()
而无需再次搜索整个列表以获取最大索引(ArrayList.indexOf()
将执行的操作)。