我们如何动态分配和增长数组

Zac*_*ner 9 java arrays word-count

我正在研究一个项目,但我不能使用任何现有的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++;
         } 
   }
Run Code Online (Sandbox Code Playgroud)

现在这适用于100个以下列表项.br.readline是遍历文本文件每一行的缓冲读取器.我有它然后将每个单词存储到列表中,然后递增我的索引(wordCount).

但是,一旦我有一个包含超过100个项目的文本文件,我就会收到分配错误.

如何动态更新此阵列(从而重新发明轮子)?

谢谢!

Ted*_*opp 18

你可以这样做:

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++;
     } 
}
Run Code Online (Sandbox Code Playgroud)

使用java.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;
}
Run Code Online (Sandbox Code Playgroud)

除了它是一行代码而不是三行.:)


pca*_*cao 5

您分配一个新的Array(例如,容量的两倍),并将所有元素移动到它.

基本上你需要检查是否wordCount要点击它wordList.size(),当它发生时,创建一个新的数组,其长度是前一个的两倍,并将所有元素复制到它(创建一个辅助方法来执行此操作),并分配wordList给您新阵列.

要复制内容,你可以使用System.arraycopy,但我不确定是否允许你的限制,所以你可以简单地逐个复制元素:

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;
}
Run Code Online (Sandbox Code Playgroud)

继续.

  • 或者你可以使用`array = Arrays.copyOf(array,newLength)`. (2认同)