【发布时间】:2018-10-25 13:34:38
【问题描述】:
我制作的程序能够读取文件并打印所有不同单词的列表。但是,我想使用分隔符删除单词开头和结尾的所有逗号和其他字符。但是,我只是不知道如何以正确的方式构建它以及将它放在我的代码中的什么位置。有人可以解释一下在哪里以及如何正确实现它吗?
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":
// 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;
}
}
此时的输出示例:
U.S.
state's
laws.
principal
office
4557
Melan
Dr.
S.
Fairbanks,
AK,
99712.,
scattered
throughout
numerous
locations.
809
North
1500
West,
Salt
Lake
City,
UT
84116,
(801)
596-1887,
email
business@pglaf.org.
Email
contact
information
http://pglaf.org
information:
Gregory
B.
Newby
Chief
Executive
Director
gbnewby@pglaf.org
4.
Donations
【问题讨论】:
-
String.replace()是否有任何理由不适合您的需求? -
是的,这是 uni 的作业。到目前为止还不允许使用该命令。
-
输出应该是什么?例如,
business@pglaf.org.或http://pglaf.org会发生什么?是否有应删除的特定字符列表? -
输出应该是最符合逻辑的单词列表。因此,我必须根据三个文件自行选择要删除的内容和不删除的内容。它不必是完美的,但它应该删除最常见的奇怪符号。所以;剥离前导和尾随非字母。
-
我应该逐步更改分隔符以获得越来越好的输出,而不会出现奇怪的单词。
标签: java arrays list delimiter