java中的错误 - 在ArrayList中查找最大值

时间:2012-04-21 14:14:29

标签: java if-statement for-loop arraylist

以下是我写的这个问题的答案 -

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

4 个答案:

答案 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()将执行的操作)。