我正在编写一个程序,该程序可以执行多项操作。首先,它通过控制台要求用户提供文件名。接下来,要求用户从三个不同的命令中进行选择:读取,内容或停止。我的问题是关于阅读的部分。它应显示给定文件中的单词总数。在单独的openTextFile()类中读取文件。因此,我应该将主字符串中的大小写“ read”与openTextFile()链接起来,并显示单词总数。
那是我被困住的地方。只是不知道如何遍历输入流并计算单词数。有人可以帮我吗?
package nl.ru.ai.SjoerdSam.exercise7;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Concordances
{
final static int MAX_NR_OF_WORDS=20000;
public static void main(String[] args) throws FileNotFoundException
{
try
{
String[] words=new String[MAX_NR_OF_WORDS];
int[] freqs=new int[MAX_NR_OF_WORDS];
boolean terminate=true;
Scanner scanner=openTextFile();
int nr=findAndCountWords(scanner,words,freqs);
while(terminate)
{
Scanner input=new Scanner(System.in);
System.out.println("Please enter 'read' to start reading a file and display number of words read, "+"'content' to display content (all currently stored words in the order of apperance), "+"'stop' to stop the program or "+"'count'+ the word you want to count to count the number of occurences of a word, "+"the total number of words and the percantage of occurences.");
String command=input.nextLine();
switch(command)
{
case "read":
System.out.println("The number of words in this file is"+nr);
break;
case "content":
displayWords(nr,words,freqs);
break;
case "stop":
terminate=false;
System.out.println("Program terminated");
break;
case "count":
// Under construction: Bit stuck here on how to do the count and show the frequency of a single word. if i would actually get the frequency the percentage could be found by dividing the frequency with total number of words found above
Scanner single=new Scanner(System.in);
System.out.println("Please type in the word you want to know data of");
String word=single.nextLine();
findAndCountWord(scanner,words,word);
System.out.println("The frequency for the word"+" "+single+" "+"is"+findAndCountWord(single,words,word));
break;
}
}
}
catch(IllegalArgumentException e)
{
System.out.print(e);
}
}
static Scanner openTextFile() throws FileNotFoundException
{
assert (true);
Scanner input=new Scanner(System.in);
System.out.println("Please enter file name: ");
String fileName=input.nextLine();
FileInputStream inputStream=new FileInputStream(fileName);
return new Scanner(inputStream);
}
static int findAndCountWords(Scanner scanner, String[] words, int[] freqs)
{
assert words!=null&&freqs!=null;
int nr=0;
while(scanner.hasNext())
{
String word=scanner.next();
if(updateWord(word,words,freqs,nr))
nr++;
}
return nr;
}
static boolean updateWord(String word, String[] words, int[] freqs, int nr)
{
assert nr>=0&&words!=null&&freqs!=null;
int pos=sequentialSearch(words,0,nr,word);
if(pos<nr)
{
freqs[pos]++;
return false;
} else
{
words[pos]=word;
freqs[pos]=1;
return true;
}
}
static int sequentialSearch(String[] array, int from, int to, String searchValue)
{
assert 0<=from&&0<=to : "Invalidbounds";
assert array!=null : "Array shouldbeinitialized";
if(from>to)
return to;
int position=from;
while(position<to&&(!array[position].equals(searchValue)))
position++;
return position;
}
static void displayFrequencies(int nr, String[] words, int[] freqs)
{
assert nr>=0&&words!=null&&freqs!=null;
for(int i=0;i<nr;i++)
{
System.out.println(words[i]+" "+freqs[i]);
}
}
static void displayWords(int nr, String[] words, int[] freqs)
{
assert nr>=0&&words!=null&&freqs!=null;
for(int i=0;i<nr;i++)
{
System.out.println(words[i]);
}
}
static int findAndCountWord(Scanner scanner, String[] words, String word)
{
assert words!=null;
int wordCount=0;
while(scanner.hasNext())
{
for(int i=0;i<words.length;i++)
{
if(word.equals(words[i]))
{
wordCount++;
}
}
}
return wordCount;
}
}
答案 0 :(得分:0)
根据以下评论进行编辑:
import java.io.File;
import java.util.Scanner;
public class Count {
public static int countWords(Scanner sc){
int wordsCount=0;
while(sc.hasNext()){
sc.next();
wordsCount++;
}
System.out.println("wordsCount: " + wordsCount);
return wordsCount;
}
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(new File("/Users/shiva/Desktop/file.txt"));
countWords(scanner);
}
}