我正在编写一个程序,它接收一个文件并将其内容写入数组。然后使用选择排序算法对数组进行排序,然后使用二进制搜索算法进行搜索。该数组不能超过100个元素,我不能使用用户定义的类。
/*Griffen Fox
CS 110
Assignment 5
Question 1
*/
import java.util.Scanner;
import java.io.*;
public class WordsSearchProgram
{
public static void main(String[] args)throws IOException
{
//Loads Words.txt to an array
final int SIZE = 100; //Size of the array
String[] words = new String[SIZE]; // creates the array
int index = 0; // Loop Control Variable
//Opens the File
File file = new File("words.txt");
Scanner inputFile = new Scanner(file);
//Reads Contents Into Array
while (inputFile.hasNext() && index < words.length)
{
words[index] = inputFile.nextLine();
index++;
}
//Close File
inputFile.close();
int search;
for (index = 0; index < words.length; index++)
{
search = searchString(words, words[index]);
if (search >= 0)
{
System.out.println(words[index] + " is at index " + search);
}
else
{
System.out.println(words[index] + " is not in the array.");
}
}
}
//Selection Sort Algorithm
public static String[] sort(String[] words)
{
for (int i = words.length - 1; i >= 1; i--)
{
// Find the maximum in the list[0..i]
String currentMax = words[0];
int currentMaxIndex = 0;
for (int j = 1; j <= i; j++)
{
if (currentMax.compareTo(words[j]) < 0)
{
currentMax = words[j];
currentMaxIndex = j;
}
}
// Swap list[i] with list[currentMaxIndex] if necessary;
if (currentMaxIndex != i)
{
words[currentMaxIndex] = words[i];
words[i] = currentMax;
}
}
return words;
}
//Binary Search String
public static int searchString(String[] words, String key)
{
int first = 0;
int last = words.length;
int position = -1;
boolean found = false;
while (!found && first <= last)
{
int mid = ((first + last) / 2);
if (key.compareTo(words[mid]) == 0)
{
found = true;
position = mid;
}
else if (key.compareTo(words[mid]) > 0)
{
first = mid - 1;
}
else
{
first = mid + 1;
}
}
return position;
}
}
答案 0 :(得分:0)
数组的大小&#34;字&#34;但是你在数组中填入了从&#34; words.txt&#34;。
中读取的单词如果文件的行少于100,该怎么办?
然后是&#34;单词&#34;的一些元素。将为NULL。
答案 1 :(得分:0)
您的文件少于100行,因此单词[mid]为空!
if (key.compareTo(words[mid]) == 0) // causes to NullPointErexception
即使你解决了这个问题,上面一行会引发java.lang.ArrayIndexOutOfBoundsException
,所以你应该改变很多东西!
要解决此问题,您可以执行此操作:
ArrayList<String> words = new ArrayList<String>();
...
words.add(inputFile.nextLine());
并从
更改循环条件while (inputFile.hasNext() && index < words.length)
到
while (inputFile.hasNext() && index < SIZE)
并使用words
简单地获得words.size()
的大小。
修改:
您可以轻松地将words
传递给sort
方法,而不是word[index]
使用words.get(index)
和words.set(index, element)
。
答案 2 :(得分:0)
在你的第一个while循环中你需要像
这样的东西while (inputFile.hasNext() && index < words.length)
{
words[index] = inputFile.nextLine();
index++;
numOfWords = index + 1;
}
在下面的循环中使用numOfWords变量作为比较,这样你就永远不会到达数组中的一个点,它是NULL
答案 3 :(得分:0)
正如 Mok 所提到的,您需要使用ArrayList
而不是数组。此外,必须使用预定义的方法,如equals方法,同时编写代码以避免重新发明轮子,并保持代码bug免费。
使用equals方法
key.equals(words[mid])
或
在使用null
运算符之前检查compareTo
值。
if(key!=null && words[mid]!=null && key.compareTo(words[mid]) > 0)
使用arraylist将帮助您解决arrayindexoutofbounds
异常