Я не уверен, является ли это причиной вашей проблемы, но это очень подозрительно ...
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
используется для обеспечения его правильного закрытия независимо от успеха операции.
Взгляните на Оператор попытки с ресурсами для получения более подробной информации.
Если это не является особым требованием, я бы также рекомендовал использовать ArrayList
или System.arraycopy
для прокрутки собственного решения, подобного этому.
Возможнопосмотрите Список реализаций для получения более подробной информации
Обновление из запускаемого примера ...
После воспроизведения без запускаемого примера кода, когда 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