gpt4 book ai didi

java - 如何在不出现 NullPointEreException 的情况下将数组的大小加倍?

转载 作者:行者123 更新时间:2023-12-02 01:53:10 26 4
gpt4 key购买 nike

首先,为了快速了解背景信息,这是我昨天的帖子:

How to work around a NullPointerException in Java?

所以我得到了这个 NullPointerException,我现在相信它是在我尝试查找字符串数组中第一个重复项的索引之前发生的。在搜索第一个重复项的索引之前,我使用此方法将字符串数组的大小加倍:

static String[] upSizeArr( String[] fullArr )
{

int size = fullArr.length;
String[] newSizeArr = new String[(2 * size)];
for (int a = 0; a < size; a++) {
newSizeArr[a] = fullArr[a];
}
return newSizeArr;
}

然后我在 while 循环的上下文中使用该方法:

static final int CAPACITY = 10;
int wordCount = 0;

BufferedReader wordFile = new BufferedReader( new FileReader(args[1]) );
String[] wordList = new String[CAPACITY];

while ( wordFile.ready() )
{ if ( wordCount == wordList.length )
wordList = upSizeArr( wordList );
wordList[wordCount++] = wordFile.readLine();
}
wordFile.close();

使用 upSizeArr 方法是否可以解决此问题?我希望解决方案是基本的,并且仅使用数组而不使用其他数据结构。我是编程新手,我真的很想掌握基础知识...大约一周左右的时间一直在寻找此 NullPointException 的解决方案。

这是完整的代码:

import java.io.*;
import java.util.*;
public class Practice
{
static final int CAPACITY = 10;
static final int NOT_FOUND = -1;
public static void main (String[] args) throws Exception
{
if (args.length < 1 )
{
System.out.println("\nusage: C:\\> java Practice <words filename>\n\n"); // i.e. C:\> java Lab2 10Kints.txt 172822words.txt
System.exit(0);
}


String[] wordList = new String[CAPACITY];
int wordCount = 0;
BufferedReader wordFile = new BufferedReader( new FileReader(args[0]) );

while ( wordFile.ready() ) // i.e. while there is another line (word) in the file
{ if ( wordCount == wordList.length )
wordList = upSizeArr( wordList );
wordList[wordCount++] = wordFile.readLine();
} //END WHILE wordFile
wordFile.close();
System.out.format( "%s loaded into word array. size=%d, count=%d\n",args[0],wordList.length,wordCount );
int dupeIndex = indexOfFirstDupe( wordList, wordCount );
if ( dupeIndex == NOT_FOUND )
System.out.format("No duplicate values found in wordList\n");
else
System.out.format("First duplicate value in wordList found at index %d\n",dupeIndex);

} // END OF MAIN

// TWO METHODS

static String[] upSizeArr( String[] fullArr )
{

int size = fullArr.length; //find the length of the arrays
String[] newSizeArr = new String[(2 * size)]; // creates new array, doubled in size
for (int a = 0; a < size; a++) {
newSizeArr[a] = fullArr[a];
}
return newSizeArr;

}
static int indexOfFirstDupe( String[] arr, int count )
{
Arrays.sort(arr);
int size = arr.length;
int index = NOT_FOUND;

for (int x = 0; x < size; x++) {
for (int y = x + 1; y < size; y++) {
if (arr[x].equals(arr[y])) {
index = x;
break;
}
}
}
return index;
}
} // END OF PROGRAM

此外,用作参数的文件是字符串的 txt 文件。

最佳答案

我不确定这是否是您问题的原因,但很可疑......

while ( wordFile.ready() ) {
//...
}

不是您应该阅读文件的方式。相反,您应该检查 readLine 的返回结果,当它到达文件末尾时,它将返回 null

也许更像......

try (BufferedReader wordFile = new BufferedReader(new FileReader(args[1]))) {
String[] wordList = new String[CAPACITY];

String text = null;
while ((text = wordFile.readLine()) != null) {
if (wordCount == wordList.length) {
wordList = upSizeArr(wordList);
}
wordList[wordCount++] = text;
}
} catch (IOException ex) {
ex.printStackTrace();
}

您的代码还存在使文件资源保持打开状态的风险。上面的示例使用 try-with-resources 语句来确保它正确关闭,无论操作是否成功。

看看The try-with-resources Statement了解更多详情。

除非有特定要求,否则我还建议使用 ArrayListSystem.arraycopy像这样滚动你自己的解决方案。

也许看看 List Implementations了解更多详情

从可运行示例更新...

在没有可运行的代码示例的情况下进行游戏后,当 upSizeArr 创建新数组时,它会将新元素默认为 null,这是预期的,我'我很惊讶 Arrays.sort 无法处理这个问题。

“A”解决方案是用不同的非默认值填充未使用的空间...

static String[] upSizeArr(String[] fullArr) {

int size = fullArr.length; //find the length of the arrays
String[] newSizeArr = new String[(2 * size)]; // creates new array, doubled in size
for (int a = 0; a < size; a++) {
newSizeArr[a] = fullArr[a];
}
for (int a = size; a < newSizeArr.length; a++) {
newSizeArr[a] = "";
}
return newSizeArr;

}

“另一个”解决方案可能是“缩小”数组以适应可用数据......

static String[] downsizeToCapacity(String[] fullArr) {
int lastIndex = 0;
while (lastIndex < fullArr.length && fullArr[lastIndex] != null) {
lastIndex++;
}
if (lastIndex >= fullArr.length) {
return fullArr;
}
String[] downSized = new String[lastIndex];
System.arraycopy(fullArr, 0, downSized, 0, lastIndex);

return downSized;
}

所有这些尝试做的就是创建一个新数组,其大小仅足以包含所有非空值并返回该数组。

然后你可以使用类似...

System.out.format("%s loaded into word array. size=%d, count=%d\n", "words.txt", wordList.length, wordCount);
wordList = downsizeToCapacity(wordList);
System.out.format("%s loaded into word array. size=%d, count=%d\n", "words.txt", wordList.length, wordCount);

int dupeIndex = indexOfFirstDupe(wordList, wordCount);

在我的测试中,输出

words.txt loaded into word array. size=160, count=99
words.txt loaded into word array. size=99, count=99
No duplicate values found in wordList

关于java - 如何在不出现 NullPointEreException 的情况下将数组的大小加倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52683866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com