0

en int 要素を配列に追加する必要があります。

配列をarrayListに変換し、intを追加してから、arrayListを再度配列に変換することを考えました。

案の定、完全に失敗しました。

aGrades は配列、lGrades は ArrayList です

// add one grade from 1-5
    public void enter (int grade){
    ArrayList<Integer> lGrades = new ArrayList<Integer>(Arrays.asList(aGrades));
    lGrades.add(grade);
    aGrades = listArray.toArray(lGrades);
  }

現在のエラーは次のとおりです。

Histo.java:28: error: no suitable constructor found for ArrayList(List<int[]>)
    ArrayList<Integer> lGrades = new ArrayList<Integer>(Arrays.asList(aGrades));
                                 ^
constructor ArrayList.ArrayList(Collection<? extends Integer>) is not applicable
  (actual argument List<int[]> cannot be converted to Collection<? extends Integer> by method invocation conversion)
constructor ArrayList.ArrayList() is not applicable
  (actual and formal argument lists differ in length)
constructor ArrayList.ArrayList(int) is not applicable
  (actual argument List<int[]> cannot be converted to int by method invocation conversion)
Histo.java:30: error: incompatible types
    aGrades = lGrades.toArray(new Integer[lGrades.size()]);
                             ^
  required: int[]
  found:    Integer[]

これはおそらく完全な混乱ですが、私はこれについて多くのスレッドを検索しましたが、今では非常に混乱しています.

どうもありがとう!

4

4 に答える 4

0

他の人が述べているように、最善の策はIntegerオブジェクトでArrayListを使用することです。intプリミティブの配列を使い続けたい場合は、配列を使用してサイズ変更を管理することをお勧めします。

  // add one grade from 1-5
  public void enter (int grade){
    int[] aGradesTmp = new int[aGrades.length+1];
    System.arraycopy(aGrades, 0, aGradesTmp, 0, aGrades.length);
    aGradesTmp[aGrades.length] = grade;
    aGrades = aGradesTmp;
  }

上記で行っているのは、メモリとプロセッサの効率が悪いことです。この回避策はメモリ効率が悪いですが、System.arraycopy()がネイティブメソッドとして実装されているため、プロセッサ上でより効率的です。

最終的には、可能な限り配列から離れて、コレクションクラスを使用するだけです。

于 2013-01-13T22:32:19.513 に答える
0

試す

    aGrades = Arrays.copyOf(aGrades, aGrades.length + 1);
    aGrades[aGrades.length - 1] = grade;
于 2013-01-13T16:09:14.277 に答える
0

問題がコンパイル時エラーの場合は、次の行にあります。

aGrades = listArray.toArray(lGrades);

単純に次のように置き換えます。

aGrades = lGrades.toArray(new Integer[lGrades.size()]);

List<Integer>そもそもa を使用することをお勧めしますが。

于 2013-01-13T16:04:40.123 に答える
0

配列に要素を追加する必要がある場合はArrayList、前後に変換するのではなく、単に and を使用する方がよいでしょう。ただし、何らかの理由でそれを行いたくない場合は、配列を長くするより効率的な方法は次のようになります。

int [] newAGrades = new int[aGrades.length + 1];

System.arraycopy(aGrades, 0, newAGrades, 0, aGrades.length);

newAGrades[aGrades.length] = grade;

aGrades = newAGrades;

ただし、繰り返しますが、を使用するだけのArrayList方がはるかに優れたアイデアです。

aGrades.add(grade)
于 2013-01-13T16:05:11.183 に答える