扫描仪帮助 - Java

时间:2012-02-19 04:20:29

标签: java file java.util.scanner filereader

我正在寻找一些帮助,因为我在如何实现这一目标的最终结果。

分配是读入一个包含州名,该州的州长和他得到的补偿的文件。

文件示例:

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循环,稍后在我的代码中。我真的不想粘贴整个东西。

任何提示都会受到欢迎!谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

编辑:您提到还要求“领导者”名称的格式为“名字姓氏姓氏”“名字M.姓氏”或“F.中间名姓氏”。现在你已经足够解决问题了。

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

答案 1 :(得分:1)

可以修改文件以包含空格之类的分隔符,例如分号。否则,我能想到的一个选项是存储状态列表并迭代它们并检查其他方面它将是一个名称。例如

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

答案 2 :(得分:1)

我之前的回答完全没有使用Scanner,这是一个明确的要求。和以前一样,我使用“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");
}

答案 3 :(得分:0)

这个问题是关于有效的字符串搜索。让我们确定字符串的哪一部分是城市或州名,因为一旦你有了,其余的都是微不足道的。

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

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

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

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

有趣的是,只需要一点点信息就可以改变问题的范围:)