任务是从外部文件中读取一篇文本文章,并将每个单词(没有符号)作为一个单独的字符串放入和数组列表中。尽管我确信我的路径是正确的和可读的(例如,我可以执行字符计数),但是不管我做了什么,我从那篇文章中得到的数组单词列表都是空的。我可能在努力寻找一种方法来区分彼此之间的单词和其他符号。也可以存储阅读结果。
在过去的两个小时里,我一直在谷歌上搜索并阅读类似的答案,但没有成功。所以第一次决定问一个问题。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import org.w3c.dom.Text;
public class PlaceForErrors {
public static void main(String[] args) {
Scanner scan = null;
try {
scan = new Scanner(new File("\\Users\\marga\\Desktop\\objekt program\\oo2021\\w05_kontrolltoo1\\textHere.txt")).useDelimiter(" \\$ |[\\r\\n]+");
String token1 = "";
ArrayList<String> text = new ArrayList<String>();
while (scan.hasNext()) {
token1 = scan.next();
text.add(token1);
}
String[] textArray = text.toArray(new String[0]);
for(String element : textArray){
System.out.println(element);
}
//Controlling if the ArrayList is empty and it is
boolean tellme = text.isEmpty();
System.out.println(tellme);
} catch (FileNotFoundException exception) {
System.out.println(exception);
}
finally{
scan.close();
}
}
}发布于 2021-03-05 21:53:38
String[] textArray = text.toArray(new String[0]);这句话是你的问题。您正在尝试将ArrayList分配到一个大小为0的字符串数组中,结果它看起来是空的。
我将修改数组声明以使用ArrayList大小进行初始化,如下所示:
String[] textArray = text.toArray(new String[text.size()]);然后,您可以看到令牌分隔符是否有效。
发布于 2021-03-06 02:21:51
快速回顾你的脚步
你的程序做了很多。我数了9个台阶:
tokenizer)
g 219读取的文件
现在,让我们开始寻找可能出错的步骤:错误的位置️
分析:什么会出错?
看看上面列出的步骤,从什么可能出错的角度来考虑每一个步骤,一个快速检查列表(与上面的步骤编号无关!):
IOException一样的FileNotFoundException都会被抛出和打印。文件textFile =新文件(“\ textFile \marga\Desktop\objekt System.out.println”(“文件大小:”+ textFile.length() );//之前将提取的文件变量传递给扫描器扫描=新扫描仪(TextFile ).useDelimiter(“\$ |\r\n+");
//只是一个单独的测试:相同的分隔符,带有测试输入字符串delimiterRegex =“\$ |\r\n+";字符串testInput =”$Hello\r\n nWorld!\n\n nBye“;/因此我们创建了一个新的扫描器testScanner =新扫描器( testInput ).useDelimiter(delimiterRegex);int tokenCount = 0;while( testScanner.hasNext() ){ tokenCount++;System.out.println("Token”+ tokenCount +:“+testScanner.next”);} testScanner.close();
应该在控制台的3行上打印3个令牌(Hello、World !、Bye.)。特殊序列$ (空格-美元-空格)、任何\n或\r (换行符或回车)都被省略,并拆分了令牌.。
//不仅检查ArrayList是否为空,而且检查其大小(如果为空)System.out.println(“列表中扫描的令牌:”+ text.size());
如果它是空的,那么我们不需要填充数组,也不需要循环打印(因为没有循环)。
希望这些解释能帮助您自己执行分析(调试/测试)。如果它能帮你解决这个问题,请告诉我。
分而治之!
为什么我要数上面的台阶?因为所有这些都是潜在的错误所在。在开发人员术语中,我们还说类main方法PlaceForErrors有许多责任:计数9。
有一个黄金原则叫做单一责任原则(SRP)。简单地说:将一个大型问题或程序(在这里:您的大型main方法)分割成更小的部分总是很好的。如果错误或意外发生,这些较小的部分更容易处理(精神上的)、更容易测试、更易于调试。分而治之!
如果成功了,就开始改进
您可以将这个执行9个步骤的长方法拆分为更小的方法。优点:每种方法都可以进行隔离测试,比如testScanner。
如果您的程序最终按预期工作,并且手动测试变成绿色。然后,您应该将工作代码发布到姐妹站点:CodeReview。
要好奇,再问一遍,例如如何划分方法,如何使测试性,等等。你会得到很多关于如何改进的经验建议。
发布于 2021-03-08 22:20:01
谢谢大家的投入!
关于代码,我一步一步地检查了所有的东西,并在途中了解了更多关于分隔符和扫描器的知识。我把定界符修好了,现在一切都很好。
此外,我犯了一个新手的错误,没有显示完整的代码,因为我认为它会从主要问题上转移注意力。我的主要功能中有两个相互冲突的扫描器(一个是我展示给你的,另一个是再次扫描和计数字母A)。他们都各自工作得很好(当其中一个人被剔除时),但他们拒绝一起工作。所以我找到了一种方法来组合它们,只使用一次扫描仪。我将分享我的全部代码,以供参考。
我学会了我的错误,并将提供我的完整代码永远在未来。
如果有人好奇的话,整个任务如下:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
public class Trying {
public static void main(String[] args) {
Scanner scan = null;
try {
//SCANNING FILE AND CREATING AN ARRAYLIST
scan = new Scanner(new File("\\Users\\marga\\Desktop\\objekt program\\oo2021\\w05_kontrolltoo1\\textHere.txt")).useDelimiter("[.,:;()?!\"\\s]+");
int aCount = 0;
int letterCount =0;
String token1 = "";
int wordWithAtLeastOneA = 0;
int wordWithA = 0;
int word1A = 0;
int word2A = 0;
int word3A = 0;
int word4OrMoreA = 0;
ArrayList<String> text = new ArrayList<String>();
// SCANNING EVERY WORD INTO AN ARRAY LIST
while(scan.hasNext()){
token1 = scan.next();
text.add(token1);
}
System.out.println("Amount of words in the scanned list is : " + text.size());
//COUNTING HOW MANY LETTERS 'A' TEXT HAS
for(String element : text){
for (int i=0;i<=element.length()-1;i++){
if (element.charAt(i) == 'A' || element.charAt(i) == 'a') {
aCount++;
}
}
}
System.out.println("There are "+aCount+" letters 'A'. ");
//HOW MANY LETTERS IN TOTAL TEXT HAS
for(String element : text){
for (int i=0;i<=element.length()-1;i++){
letterCount++;
}
}
//COUNTING HOW MANY WORDS HAVE 'A' LETTER IN THEM
for(String element : text){
for (int i=0;i<=element.length()-1;i++){
if (element.charAt(i) == 'A' || element.charAt(i) == 'a') {
wordWithAtLeastOneA++;;
break;
}
}
}
System.out.println("There are "+wordWithAtLeastOneA+" words that have at least one letter 'A' in them.");
System.out.println();
//COUNTING NUMBER OF WORDS THAT HAVE 1/2/3 or more 'A' LETTER IN THEM
for(String element : text){
wordWithA = 0;
for (int i=0;i<=element.length()-1;i++){
if (element.charAt(i) == 'A' || element.charAt(i) == 'a') {
wordWithA++;
if(wordWithA == 1){
word1A++;
}else if (wordWithA == 2){
word2A++;
}else if (wordWithA == 3){
word3A++;
}else if (wordWithA >= 4){
word4OrMoreA++;
}
}
}
}
System.out.println("There were "+ word1A+ " words, that had one letter 'A' in them." );
System.out.println("There were "+ word2A+ " words, that had two letters 'A' in them." );
System.out.println("There were "+ word3A+ " words, that had three letters 'A' in them." );
System.out.println("There were "+ word4OrMoreA+ " words, that had 4 or more letters 'A' in them." );
//COUNTING HOW MANY LETTERS THERE ARE IN TOTAL, COMPARE TO NUMBER OF "A" LETTERS
int percentOfA = aCount*100/letterCount;
System.out.println();
System.out.println("The entire number of letters is "+ letterCount+" and letter 'A' makes " + percentOfA+ "% out of them or " +aCount+ " letters.");
// for(String element : textArray){
// System.out.println(element);
// }
} catch (FileNotFoundException exception) {
System.out.println(exception);
}
finally{
scan.close();
}
}
}案文如下:
计算机编程是一种非常灵活的工具,您可以使用它来做一些令人惊奇的事情,这些事情要么是手工的,要么是费力的,或者是不可能的。如果你使用的是智能手机,聊天应用,或者是按下按钮打开你的车,那么你必须知道所有这些东西都在使用某种编程。你已经沉浸在不同类型的节目中了。事实上,软件正在运行着你的生活。如果你按照自己的意愿学习并开始运行这些程序,该怎么办?
产出如下:
There are 35 words that have at least one letter 'A' in them.
There were 35 words, that had one letter 'A' in them.
There were 3 words, that had two letters 'A' in them.
There were 0 words, that had three letters 'A' in them.
There were 0 words, that had 4 or more letters 'A' in them.
The entire number of letters is 416 and letter 'A' makes 9% out of them or 38 letters.https://stackoverflow.com/questions/66500024
复制相似问题