首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java文本文件并使用扫描仪存储它,给我空的ArrayList。用干涉仪分词

Java文本文件并使用扫描仪存储它,给我空的ArrayList。用干涉仪分词
EN

Stack Overflow用户
提问于 2021-03-05 21:42:32
回答 3查看 320关注 0票数 1

任务是从外部文件中读取一篇文本文章,并将每个单词(没有符号)作为一个单独的字符串放入和数组列表中。尽管我确信我的路径是正确的和可读的(例如,我可以执行字符计数),但是不管我做了什么,我从那篇文章中得到的数组单词列表都是空的。我可能在努力寻找一种方法来区分彼此之间的单词和其他符号。也可以存储阅读结果。

在过去的两个小时里,我一直在谷歌上搜索并阅读类似的答案,但没有成功。所以第一次决定问一个问题。

代码语言:javascript
复制
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();
        }
    
    }
}
EN

回答 3

Stack Overflow用户

发布于 2021-03-05 21:53:38

代码语言:javascript
复制
String[] textArray = text.toArray(new String[0]);

这句话是你的问题。您正在尝试将ArrayList分配到一个大小为0的字符串数组中,结果它看起来是空的。

我将修改数组声明以使用ArrayList大小进行初始化,如下所示:

代码语言:javascript
复制
String[] textArray = text.toArray(new String[text.size()]);

然后,您可以看到令牌分隔符是否有效。

票数 0
EN

Stack Overflow用户

发布于 2021-03-06 02:21:51

快速回顾你的脚步

你的程序做了很多。我数了9个台阶:

tokenizer)

  • scan

  • 以(文本)输入流的形式打开(文本)文件,从

  • 中读取,使用正则表达式作为分隔符(= for和迭代每个后续令牌(如果有发现的话),创建一个从输入流中读取令牌的扫描器,如果没有其他标记,则将令牌添加到list
  1. ,然后迭代结束(或从未启动!):使用for-每个循环将列表转换为对每个数组元素的数组
  2. 循环,并打印它
  3. ,检查最初收集的列表是否为空,如果没有找到文件,则打印true或false
  4. 捕捉异常,然后打印it
  5. ,最后关闭任何打开的资源:从

g 219读取的文件

现在,让我们开始寻找可能出错的步骤:错误的位置️

分析:什么会出错?

看看上面列出的步骤,从什么可能出错的角度来考虑每一个步骤,一个快速检查列表(与上面的步骤编号无关!):

  1. 能找到你的文本文件吗?它存在并且是可读的吗?是的,否则任何像IOException一样的FileNotFoundException都会被抛出和打印。

  1. 打开的文件是否为空,大小为0字节?您可以使用以下方法进行检查:

文件textFile =新文件(“\ textFile \marga\Desktop\objekt System.out.println”(“文件大小:”+ textFile.length() );//之前将提取的文件变量传递给扫描器扫描=新扫描仪(TextFile ).useDelimiter(“\$ |\r\n+");

  1. 是否正确地拆分/标记了一个示例输入字符串?尝试:

//只是一个单独的测试:相同的分隔符,带有测试输入字符串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个令牌(HelloWorld !Bye.)。特殊序列$ (空格-美元-空格)、任何\n\r (换行符或回车)都被省略,并拆分了令牌.。

  1. 我们应该在while-循环之后直接检查列表:

//不仅检查ArrayList是否为空,而且检查其大小(如果为空)System.out.println(“列表中扫描的令牌:”+ text.size());

如果它是空的,那么我们不需要填充数组,也不需要循环打印(因为没有循环)。

希望这些解释能帮助您自己执行分析(调试/测试)。如果它能帮你解决这个问题,请告诉我。

分而治之!

为什么我要数上面的台阶?因为所有这些都是潜在的错误所在。在开发人员术语中,我们还说类main方法PlaceForErrors有许多责任:计数9。

有一个黄金原则叫做单一责任原则(SRP)。简单地说:将一个大型问题或程序(在这里:您的大型main方法)分割成更小的部分总是很好的。如果错误或意外发生,这些较小的部分更容易处理(精神上的)、更容易测试、更易于调试。分而治之!

如果成功了,就开始改进

您可以将这个执行9个步骤的长方法拆分为更小的方法。优点:每种方法都可以进行隔离测试,比如testScanner

如果您的程序最终按预期工作,并且手动测试变成绿色。然后,您应该将工作代码发布到姐妹站点:CodeReview

要好奇,再问一遍,例如如何划分方法,如何使测试性,等等。你会得到很多关于如何改进的经验建议。

票数 0
EN

Stack Overflow用户

发布于 2021-03-08 22:20:01

谢谢大家的投入!

关于代码,我一步一步地检查了所有的东西,并在途中了解了更多关于分隔符和扫描器的知识。我把定界符修好了,现在一切都很好。

此外,我犯了一个新手的错误,没有显示完整的代码,因为我认为它会从主要问题上转移注意力。我的主要功能中有两个相互冲突的扫描器(一个是我展示给你的,另一个是再次扫描和计数字母A)。他们都各自工作得很好(当其中一个人被剔除时),但他们拒绝一起工作。所以我找到了一种方法来组合它们,只使用一次扫描仪。我将分享我的全部代码,以供参考。

我学会了我的错误,并将提供我的完整代码永远在未来。

如果有人好奇的话,整个任务如下:

  1. 使用扫描仪从一个单独的文件中读取文本,并将其存储在数组列表中。
  2. 计算出" A“(小的或大的)有多少个字母,以及它们从文本中的所有字母中所占的百分比有多大。
  3. 计数一个字母A、两个字母A的单词数,等等。

代码语言:javascript
复制
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();
        }
    
    }
}

案文如下:

计算机编程是一种非常灵活的工具,您可以使用它来做一些令人惊奇的事情,这些事情要么是手工的,要么是费力的,或者是不可能的。如果你使用的是智能手机,聊天应用,或者是按下按钮打开你的车,那么你必须知道所有这些东西都在使用某种编程。你已经沉浸在不同类型的节目中了。事实上,软件正在运行着你的生活。如果你按照自己的意愿学习并开始运行这些程序,该怎么办?

产出如下:

代码语言:javascript
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66500024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档