10

プロジェクトに取り組んでいますが、既存の Java データ構造 (つまり、ArraysList、ツリーなど) を使用できません。

配列しか使えません。したがって、配列を新しいメモリで動的に更新する必要があります。

テキスト ファイルから読み取りを行っており、配列メモリに 100 を事前に割り当てています。

   String [] wordList;
   int wordCount = 0;
   int occurrence = 1;
   int arraySize = 100;
   wordList = new String[arraySize];
   while ((strLine = br.readLine()) != null)   {
         // Store the content into an array
         Scanner s = new Scanner(strLine);
         while(s.hasNext()) {
           wordList[wordCount] = s.next();
           wordCount++;
         } 
   }

現在、これは 100 個未満のリスト アイテムで問題なく機能します。br.readline は、テキストファイルの各行を通過するバッファー付きリーダーです。次に、各単語をリストに格納してから、インデックス (wordCount) をインクリメントします。

ただし、100 項目を超えるテキスト ファイルを作成すると、割り当てエラーが発生します。

この配列を動的に更新するにはどうすればよいでしょうか (それによって車輪の再発明のようなものになります)。

ありがとう!

4

8 に答える 8

20

次のようなことができます。

String [] wordList;
int wordCount = 0;
int occurrence = 1;
int arraySize = 100;
int arrayGrowth = 50;
wordList = new String[arraySize];
while ((strLine = br.readLine()) != null)   {
     // Store the content into an array
     Scanner s = new Scanner(strLine);
     while(s.hasNext()) {
         if (wordList.length == wordCount) {
              // expand list
              wordList = Arrays.copyOf(wordList, wordList.length + arrayGrowth);
         }
         wordList[wordCount] = s.next();
         wordCount++;
     } 
}

Usingjava.util.Arrays.copyOf(String[])は、基本的に次と同じことを行います。

if (wordList.length == wordCount) {
    String[] temp = new String[wordList.length + arrayGrowth];
    System.arraycopy(wordList, 0, temp, 0, wordList.length);
    wordList = temp;
}

ただし、3 行ではなく 1 行のコードです。:)

于 2013-02-12T16:34:13.910 に答える
5

新しい配列を割り当て (たとえば、容量を 2 倍にします)、すべての要素をそこに移動します。

基本的に、 が にヒットしようとしているかどうかを確認する必要があります。wordCountヒットしたwordList.size()場合は、前の配列の 2 倍の長さの新しい配列を作成し、すべての要素をコピーします (これを行う補助メソッドを作成しwordListます)。新しいアレイ。

コンテンツをコピーするには、を使用できSystem.arraycopyますが、それが制限で許可されているかどうかわからないため、要素を1つずつコピーするだけです:

public String[] createNewArray(String[] oldArray){
    String[] newArray = new String[oldArray.length * 2];
    for(int i = 0; i < oldArray.length; i++) {
        newArray[i] = oldArray[i];
    }

    return newArray;
}

続行。

于 2013-02-12T16:31:48.907 に答える
3

new にコピーすると、配列サイズを動的に増やすことはできませんarray。そのために使用System.arrayCopyしてください。各要素を新しい配列にコピーするよりも優れています。参考 までに System.arraycopy が Java でネイティブなのはなぜですか? .

private static Object resizeArray (Object oldArray, int newSize) {
   int oldSize = java.lang.reflect.Array.getLength(oldArray);
   Class elementType = oldArray.getClass().getComponentType();
   Object newArray = java.lang.reflect.Array.newInstance(
         elementType, newSize);
   int preserveLength = Math.min(oldSize, newSize);
   if (preserveLength > 0)
      System.arraycopy(oldArray, 0, newArray, 0, preserveLength);
   return newArray;
}
于 2013-02-12T16:33:55.583 に答える
3

Java ArrayListの実装を見てください。JavaArrayListは内部的に固定サイズの配列を使用し、要素数が現在のサイズを超えると配列を再割り当てします。同様の回線に実装することもできます。

于 2013-02-12T16:35:01.647 に答える
0

新しいより大きな配列を手動で作成し、アイテムをコピーする必要があります。

これは役立つかもしれません

于 2013-02-12T16:33:51.733 に答える
0

Visual Basic には素晴らしい機能がありますReDim Preserve

誰かが親切に同等の関数を書いています - あなたはここでそれを見つけることができます. 私はそれがあなたが求めていることを正確に行うと思います(そしてあなたは車輪を再発明していません-あなたは他の誰かのものをコピーしています)...

于 2013-02-12T16:34:28.907 に答える