我最近一直在努力争取在这项任务中取得实质性进展。我需要创建一个接收文本文件的程序,并创建生成文本文件中每个单词的输出、该单词出现的次数以及整个文件中出现的百分比。现在,我的主要问题是读取文本文件的所有值。我试图使用数组列表来存储我所读到的内容。部分细节包括应该忽略逗号、句号、分号、冒号和感叹号等字符。这是全部任务:
编写一个读取普通文本文件的程序,以构造一个单词列表和每个单词发生的次数。完成后,程序到控制台的输出应该是一个有三列的表:单词found。单词在文件中出现的次数。发现的事件的比例(例如2.17%)。 这张表是按词典顺序排列的。标点符号(
,.;:!)出现在单词的末尾,应该删除。大写和小写应忽略。连字符应该被看作是一个单词。 玛丽有一只小羊羔,一只小羊羔 A 1 14.29% 有1 14.29% 小2 28.57% 羔羊2 28.57% 玛丽1 14.29%
所以我要问的问题是:
printf来组织输出,就像给定的例子一样,这是一个最优的解决方案吗?这是我到目前为止所拥有的,正如前面所说的,我只想把所有的单词都放到数组中,而且我目前正在使用一个文本文件和示例的文本:"àMary有一只小羊羔,小羔羊“。
public class fileInfo
{
public static void main(String[]args) throws FileNotFoundException
{
Scanner scan = new Scanner(new File("testFile.txt"));
scan.useDelimiter(" ");
ArrayList<String> aL = new ArrayList<String>();
while(scan.hasNext())
{
if(scan.next() == "." || scan.next() == ",")
{
continue;
}
aL.add(scan.next());
}
scan.close();
System.out.println(aL);
}
public static ArrayList<String> constructArray(ArrayList<String>temp) throws FileNotFoundException
{
Scanner scan = new Scanner(new File("testFile.txt"));
temp = new ArrayList<String>();
while(scan.hasNext())
{
temp.add(scan.next());
}
return temp;
}
}发布于 2015-12-20 21:20:46
如何将文本文件的文字读入数组列表,以便以所需的方式操作它们。
将Scanner的分隔符设置为对空格和标点符号进行拆分。分隔符是由Pattern类定义的正则表达式。你想要的模式:
"[\\s,.;:!]+"意思是:一个或多个空格或标点符号。
什么是计算数组列表中事件数量的最佳方法,以及按字典顺序排序的最佳方法?
使用TreeMap或TreeMap<String, AtomicInteger>。
对于一个简单的英文文本解决方案,你可以简单的小写字母(你的例子)。
更好的实现是使用具有TreeMap强度的Collator初始化TERTIARY。
FYI:您的例子是错误的,因为lamb应该列在little之前。
我计划使用printf来组织输出,就像给定的例子一样,这是一个最优的解决方案吗?
这是一种适当的方式。
对于第三列百分比,我计划打印出来(单词的出现量/除以文件中的单词总数+%%签名纯文本),这是一个最佳解决方案吗?
这是一种合适的方法,也可能是最简单的方法。只需记住乘以100,并使用double而不是int执行除法。
发布于 2015-12-20 21:27:16
因为这是家庭作业,我不会把文字代码,它将需要更多的时间来解释它比搜索一个解决方案的谷歌。
我将给出一些想法,所以您只需要搜索如何在Java中实现这些想法。
1)有一个动态的字符串列表,在那里你可以存储所有的单词。
2)使用BufferedReader的readLine()方法获取文件中的每一行。
3)对于每一行,将他的所有单词存储到步骤1的字符串动态列表中。
提示:您可以使用空格来知道单词何时结束/开始。
4)当您将文件中的所有单词存储在一个动态列表中时,实现一些超级高效的方法来计算需要在输出上显示的内容。提示:你可以去擦除实际的单词,所以在未来的列表中,扫描器会更短。会是这样的:
int i,j; 对于(i= 0;i< word_list.length - 1;i++){ 对于(j=i+ 1;j< word_list.length - 1;j++){ if(word_list.get(i) == word_list.get(j)){ numberOfAppearences++;word_list.erase(j);j-;//我们删除了一个元素}} }
这将只显示一个给定单词的出现次数。显然,您必须根据您的需要使用此代码。
如果您想使它更优化,而不需要将文件数据复制到RAM中,您可以逐个字符读取文件字符,直到找到第一个空白为止,这意味着第一个单词已经结束,所以您可以将这个单词存储在一个字符串中,然后继续读取字符,直到找到下一个空白空间,这将是第二个单词,现在您将比较word1和word2,做数学,并保持读字符与第三个单词,等等。这样,您只需要两个字符串,一个用于当前单词,另一个用于下一个单词。
希望这能有所帮助。
https://stackoverflow.com/questions/34385450
复制相似问题