当前位置: 首页 > 知识库问答 >
问题:

如何使用扫描仪的分隔符方法

丌官瀚
2023-03-14

我目前正在执行游戏风险。在我的Board课程中,我阅读了三个不同的文本文件,其中包括国家、大陆及其邻近地区。当我构建一个新大陆时,它的构造器需要以下内容(字符串名、int-bonusArmies、ArrayList-memberCountries)。现在,我用扫描器从一个文本文件中读取,这个文件是这样组织的,它的名字,它拥有的奖金军队,每行的其余部分是它的成员国。

北美、5、阿拉斯加、阿尔伯塔省、中美洲、美国东部、格陵兰岛、西北地区、安大略省、魁北克省、美国西部、南美、2、阿根廷、巴西、委内瑞拉欧洲、5、英国、冰岛、北欧、斯堪的纳维亚、南欧、乌克兰、西欧非洲、3、刚果、东非、埃及、马达加斯加、北非、,南非、亚洲、7、阿富汗、中国、印度、伊尔库茨克、日本、堪察加半岛、中东、蒙古、暹罗、西伯利亚、乌拉尔、雅库茨克澳大利亚、2、澳大利亚东部、印度尼西亚、洛特、新几内亚、西澳大利亚

我知道我需要为扫描器设置一个分隔符,我已经尝试了多种方法,但都没有用。下面是我尝试创建大陆hashmap的一个示例。

public void createContinents()
{   

    Scanner inputTwo = new Scanner( new File( "continents.txt");

while( inputTwo.hasNext())  //continues to create and add countries until their are none next
{   
    String line = inputTwo.nextLine();  //stores the entire line
    Scanner lineScan = new Scanner( line);  //passes the entire line into Scanner
    lineScan.useDelimiter(","); //sets the Scanner's delimiter pattern

    String name = inputTwo.next();  //stores the first String which is the name of the current continent being created
    System.out.println( " the name is" + name);

    int bonusArmies = inputTwo.nextInt();   //stores the second String which is casted into an int for the continent bonus armies
    System.out.println(" the number of bonus armies is" + bonusArmies);

    ArrayList<Country> memberCountries = new ArrayList<Country>();  //creates an arraylist to hold the member countries of current continent

    while( inputTwo.hasNext())  //goes through the rest of the line to add the member countries until it reaches the end of the line
    {   

        memberCountries.add( countries.get(inputTwo.next()));//gets string name of country and pass it as key to store into temp arraylist of countries         
        System.out.println( "the member countries" + memberCountries);
    }

        continent = new Continent( name,  bonusArmies,  memberCountries);   //creates continent
        continents.put(name , continent);   //associates a key to the current continent

}


    inputTwo.close();

 }    

这是图像中的文本。

    PS C:\Users\repti_000\desktop\risk\homeworks2120\game> java BoardTester
     the name is
    SouthAmerica,2,Argentina,Brazil,Venezuela 

    Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at Board.createContinents(Board.java:66)
    at Board.loadBoard(Board.java:141)
    at Board.<init>(Board.java:27)
    at BoardTester.main(BoardTester.java:7)
   PS C:\Users\repti_000\desktop\risk\homeworks2120\game>

共有2个答案

柯鸿云
2023-03-14

您从inputTwo而不是lineScan获取数据。您应该在这里考虑更清晰的名称,这使得检测这类问题更加简单。而不是输入两个地图数据或世界扫描仪,而不是lineScan可能大陆数据。

易阳朔
2023-03-14

为了更清楚,我重新命名了扫描器和一些变量,并添加了一些注释。我想知道为什么你的hashmap大陆看起来像大陆(名字,大陆),而你的存储是大陆的名字(就像你用构造函数给它的那样)。使用大陆。getName()似乎是一种更好的做法。

正如罗顿爵士指出的,你用错了扫描仪,你的名字确实不清楚。试着让你的变量名更清晰一点,这应该有助于时间。

    public void createContinents()  { 

    //  Scan the continents.txt file
    Scanner worldScan = new Scanner( new File( "continents.txt");

    //  While worldScan has a next line, run loop
    //  CHANGED: not hasNext(), but hasNextLine()
    while( worldScan.hasNextLine()) {

        //  Create a scanner for the selected line in worldScan
        String continentLine = inputTwo.nextLine();
        Scanner continentScan = new Scanner(continentLine);
        continentScan.useDelimiter(",");

        //  Grab the continent from the scanner
        String name = continentScan.next();
        System.out.println( " the continent name is" + name);

        //  Grab the armies from the scanner
        //  CHANGED: you read it out as a string, not as an int
        int bonusArmies = Integer.toString(continentScan.next());
        System.out.println(" the number of bonus armies is" + bonusArmies);

        //  Instantiate loop variable countries
        ArrayList<Country> memberCountries = new ArrayList<Country>();

        while( continentScan.hasNext()) {
            memberCountries.add(countries.get(continentScan.next()));
            System.out.println( "the member countries" + memberCountries);
        }

        //  Instantiate loop variable continent
        Continent continent = new Continent( name,  bonusArmies,  memberCountries);

        //  Add continent to the hashmap
        continents.put(name,continent);

        continentScan.close();
    }

    worldScan.close();
 }
 类似资料:
  • 问题内容: 我想为扫描器指定一个分隔符,该分隔符可以按某种模式进行拆分,但不会从令牌中删除该模式。我似乎无法完成这项工作,因为正则表达式所标识的所有内容也会作为分隔符的一部分被占用。有什么建议? 我的具体问题是,我的文件看起来像: 我想从文本/数字混合+行中分离出来,直到下一个文本/数字混合。我有正则表达式来标识它们,但是如上所述,因为定界符占用了我想要的内容,所以使用了它。 编辑:代码添加: 是

  • 我是java新手,我的任务是使用扫描器读取数组,并在另一种方法中读取int。 我正在做的是计算一只兔子到达河对岸所需的最小跳跃次数。数组中的int表示从河的一边开始的石头的距离,另一个int表示石头的数量。兔子能跳的最远距离是50。 对于输入和输出: 输入n:7(输入,河中的石头数)32 46 70 85 96 123 145(输入,石头与起点之间的距离,最后一个数字是河的宽度,即目的地(河对岸)

  • 我正试图用Java中的扫描器将一个字符串分成另外两个字符串。好像不起作用。我只能通过谷歌找到扫描仪用来读取控制台输入的例子。我从扫描仪的手册中找出了我做事情的方式,我不确定我错了什么。 第一个和第二个是空白的,我不知道为什么。

  • 我正在尝试编写一个应用程序,它将占用一个非常大的sql文本文件~60GB(2.57亿行),并将每个COPY语句拆分为单独的文本文件。 但是,我目前使用的代码会导致OutOfMemoryError,因为行超过了扫描仪缓冲区限制。第一个语句将是4000万行。 请提供建议,说明这是执行此操作的错误方法还是对现有方法的修改。 谢啦

  • 我正在为课堂做作业。由于某种原因,程序完全跳过了用户应该键入变量的部分。我想不出任何理由为什么它会以这种方式运行,因为我的其余代码位于部分之后(它要求诸如和类型之类的东西)工作正常且有序。

  • 我想读取一个文本文件,并将每一行放入一个字符串(字符串数组)。然而,这需要扫描文件两次,一次是为了找出有多少行,另一次是为了创建一个这样大小的字符串数组。但它抛出了一个错误,重置方法似乎不起作用。 这是相关的代码片段。