【问题标题】:Scanner help - Java扫描仪帮助 - Java
【发布时间】:2012-02-19 04:20:28
【问题描述】:

我正在寻求一些帮助,因为我对如何完成此任务束手无策。

任务是读入一个包含州名、该州州长和他获得的补偿的文件。

文件示例:

California Tim John $50,000 $78,890 $30,000
North Dakota John Jones $30,000 $40,000 $56,000
Washington Susan K. Bones $30,000 $40,000 $56,000

如你所见,一个名字可以包含三个以上的单词(包括中间的首字母)

我应该得到的输出是总统的名字,然后是总薪酬。

输出示例:

Susan K. Bones 126,000 美元

我已经编写了打印出总补偿的代码。但我坚持读名字。如何忽略最多包含两个单词的州名而只取州长的名字?

这是我的总补偿代码。

另请注意:我必须在此使用扫描仪。

Scanner in = new Scanner(file);
            in.nextLine();      
                do {
                    double totalCompensation = 0.0; 
                    String readLine = in.nextLine();
                    readLine = readLine.replaceAll(",", "").replace("$", " ");
                    String presidentName = "";
                    Scanner readNumber = new Scanner(readLine);
                    while(readNumber.hasNext()) {                               
                        if (readNumber.hasNextDouble()) 
                            totalCompensation += readNumber.nextDouble();
                        else {
                            readNumber.next();
                        }
                    }

另一个注意事项:别担心,我确实有一段时间(in.hasNextLine()) 来关闭 do 循环,稍后在我的代码中。我只是不想粘贴整个内容。

欢迎任何提示!谢谢!

【问题讨论】:

    标签: java file java.util.scanner filereader


    【解决方案1】:

    如果您提前知道您只会看到美国的州名,您可以让您的代码先查找州名。既然你知道哪一部分是州名,哪一部分是补偿,那么剩下的一定是州长的名字。只有 50 个州,所以这不是不可能的。

    如果这更通用并且可以是城市/国家/任何地方,而不仅仅是美国,那么如果没有更好的分隔符(或定义“州名”和“州长名”的引号),就无法区分。

    编辑:您提到还有一个要求,即“领导者”名称的格式为“Firstname LastName”“Firstname M. Lastname”或“F. Middlename Lastname”。现在你有足够的时间来解决答案了。

    当你用扫描仪拉出字符串时,将它们放在一个列表中(或者如果你学习了这种数据类型,堆栈更合适)。向后浏览列表。如果第二个元素是首字母,则您知道名称包含三个部分。如果第三个元素是声母,你知道名字有三个部分。如果两者都不是首字母,则您知道该名称有两个部分。凡不是领袖的名字,都是地方的名字。

    【讨论】:

    • 是的,还可以包含城市名称:(虽然这一定是可能的...我已经被分配这个作为家庭作业!家庭作业提示告诉我们从美元符号倒退...
    【解决方案2】:

    我之前的回答完全没有使用扫描仪,这是一个明确的要求。和以前一样,我使用“New”、“North”等前缀来描述两个单词的州名。

    static String[] TWO_WORD_STATE_PREFIXES = new String[] {"New", "Rhode", "North", "West", "South"};
    
    public static void scanLine(String line) {
        Scanner s = new Scanner(line);
        String stateName = s.next();
    
        for (String prefix : TWO_WORD_STATE_PREFIXES)
            if (stateName.equals(prefix))
                stateName += " " + s.next();
    
        String governorName = "";
    
        String nextToken;
        while (!(nextToken = s.next()).startsWith("$"))
            governorName += nextToken + " ";
    
        governorName = governorName.trim();
    
        int compensation = 0;
        while (s.hasNext())
            compensation += Integer.parseInt(s.next().replaceAll("[\\$, ]", ""));
    
        System.out.println(stateName + " - " + governorName + " : " + compensation);
    }
    
    public static void main(String[] args) {
        scanLine("California Tim John $50,000 $78,890 $30,000");
        scanLine("Virginia Some Guy $55,000 $71,890 $30,000");
        scanLine("South Carolina Bill F. Gates $91,000 $1,200");
        scanLine("Vermont Joan Smith $60,000 $78,890 $30,000");
        scanLine("North Dakota Tim John $50,000 $78,890 $30,000");
    }
    

    【讨论】:

    • 嗯,谢谢!我会试试看。天啊,我希望我能对其中一些帖子进行投票,我离投票还有一点距离,对不起:(有点毁了这一点的一件事是,我的老师说我应该期待城市名称而不是州名,所以是的......这可能是我有史以来最艰巨的编程作业,我只有一周的时间来完成它!耶!
    • 如果不提前知道城市列表或添加不同的分隔符,我不知道如何对城市执行此操作。至少对于状态,有一个定义明确且易于获取的状态名称列表。
    • 是的,我必须弄清楚。显然,这很容易,因为其他人已经完成并且也可以使用城市名称。我们的老师说:“从第一个美元金额倒退,然后取前面的两个单词作为名字,除非第一个单词的形式是X,其中X是单个字母,或者它前面的形式是X.,在这种情况下,名称由三个部分组成。”虽然不知道如何“倒退”。
    • 好的,关于您在上面所做的“倒退”评论,这意味着您被告知州长/市长的姓名将是“firstname lastname”或“firstname M.I. lastname”格式。仍然不是一个非常明确的格式,因为它不适用于三个名字的州长。就像西弗吉尼亚州的伯爵雷·汤布林一样。如果是这样的话,我的代码显然是行不通的。您需要寻找中间的初始令牌并采取相应措施。
    【解决方案3】:

    是否可以修改文件以包含分号等空格以外的分隔符。否则,我能想到的一个选项是存储状态列表并遍历它们,否则检查它是否是一个名称。例如。

    List<String> stateNames={"Alabama","Alaska","Texas"};
    

    【讨论】:

    • 是的,我们可以使用分隔符,但我们不能修改文件...我不想列出州名,因为它可以是国家或城市名称,这将是一个巨大的麻烦。 :(
    【解决方案4】:

    这个问题是关于有效的字符串搜索。让我们来确定字符串的哪一部分是城市或州名,因为一旦有了,剩下的就很简单了。

    首先,您需要一个城市和州的列表。这是一个城市列表(应该很容易解析出实际的城市名称)http://www.census.gov/tiger/tms/gazetteer/places2k.txt,我相信你可以在某个地方找到一个州列表。

    一旦你有了这个,这里有一个有效解决方案的简单策略:

    • 将城市和州的列表放入哈希表中
    • 用空格分割输入字符串(例如“Califonia John Doe $213 $1232”)
    • 对于此列表的每个前缀,检查相应的字符串是否在哈希表中 - 如果是,则假定它是州/城市并相应地解析输入的其余部分。

    编辑:没关系 - 您在问题中添加了一些信息,使其更容易解决。它不再是一个高效的字符串搜索问题——它现在是一个简单的谜题,可以帮助您练习 Java 中的循环。请参阅凯恩的回答。

    有趣的是,仅仅一点点信息就能改变问题的范围:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多