0

以下是我写的作为问题答案的程序 -

“现在使用 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

最大值 = 45

线程“主”中的异常最大值 = 45 java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.ArrayList.elementData(Unknown Source) at java.util.ArrayList.remove(Unknown Source) at ArraylistInput.main(ArraylistInput.java: 46)

4

4 回答 4

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

这将为您提供一个列表,其中包含列表中最多 n 个元素。

于 2012-04-21T14:22:47.827 回答
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 循环尝试访问列表中不存在的值,这就是您收到此错误的原因。

于 2012-04-21T14:18:23.493 回答
0

max永远不会被分配,然后你试图从数组列表中删除一个不存在的元素。设置max为列表中不能出现的某个值,然后检查它是否曾在循环中分配。

于 2012-04-21T14:19:13.990 回答
0

当您从列表中删除一个元素时:

val.remove(z);

您更改了列表的大小,但没有更新您的length变量。这会导致您尝试访问超出数组大小的索引,从而导致java.lang.ArrayIndexOutOfBoundsException.

另外,考虑保存最大值的索引最大值本身。然后,当您删除该值时,您可以ArrayList.remove()直接使用而无需再次搜索整个列表以获取最大索引(这ArrayList.indexOf()将是什么)。

于 2012-04-21T14:20:00.783 回答