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 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

最大値を見つけるためにネストされた for ループを必要としない単一の ArrayList しかありません。

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 に答える