0

我有计算文本文件中一周中出现的天数的代码。截至目前,如果它是该行上唯一的字符串,它只会计算星期几。例如,如果我有一条写着 (Monday abcd) 的行,它将不计入该星期一。我尝试使用 indexOf 并通过拆分、修剪和添加回哈希映射来解决此问题,但我不知道该怎么做。

下面是一些代码,在此之前我声明了关键字,打开文本文件并将每个关键字放入映射中,值为 0

public class DayCounter
{

public static void main(String args[]) throws IOException 
{

    String[] theKeywords = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};

    // put each keyword in the map with value 0 
    Map<String, Integer> DayCount = new HashMap<String, Integer>();
    for (String str : theKeywords)
    {
        DayCount.put(str, 0);
    }

    try (BufferedReader br = new BufferedReader(new FileReader("C:\\Eclipse\\test.txt")))
    {

String sCurrentLine;

// read lines until reaching the end of the file
 while ((sCurrentLine = br.readLine()) != null) 
 {


   if (sCurrentLine.length() != 0) 
    {

    // extract the words from the current line in the file
     if (DayCount.containsKey(sCurrentLine))
     {
      DayCount.put(sCurrentLine, DayCount.get(sCurrentLine) + 1);
     }
    }
  }

这是输出部分

 for(String day : theKeywords)
 {
  System.out.println(day + " = " + DayCount.get(day));

 }
4

2 回答 2

1

您需要在字符串中搜索一周中的实际天数。现在你在问“DayCount 是否包含一个名为 [整行] 的键”,你想要的是检查每一行是否出现一周中的每一天。一种快速而肮脏的方法是围绕该单词(例如“Monday”)拆分字符串并计算结果列表的长度:

while ((sCurrentLine = br.readLine()) != null) {
    // For every line in the reader...

    for (String dayOfWeek : (Set<String>) DayCount.keySet()) {
        // For each day of the week (the keys in the DayCount map), count how
        // many times that key shows up in the line.
        int occurrences = sCurrentLine.split(dayOfWeek, -1).length - 1;

        // Now increase the appropriate counter by the number of occurrences (0+)
        DayCount.put(dayOfWeek, (Integer) DayCount.get(dayOfWeek) + occurrences);
    }
}

由于您在迭代 Set 时遇到问题(这是一个谜,但超出了您原始问题的范围),您也可以这样写(正如我在评论中提到的那样 - 请注意内部循环中的更改):

while ((sCurrentLine = br.readLine()) != null) {
    // For every line in the reader...

    //NOTE: I strongly advise renaming theKeywords to something more descriptive!
    for (String dayOfWeek : theKeywords) {
        // For each day of the week, count how many times that key shows up.
        int occurrences = sCurrentLine.split(dayOfWeek, -1).length - 1;

        // Now increase the appropriate counter by the number of occurrences (0+)
        DayCount.put(dayOfWeek, (Integer) DayCount.get(dayOfWeek) + occurrences);
    }
}

这一切都很简单。唯一奇怪的是:

int occurrences = sCurrentLine.split(dayOfWeek, -1).length - 1;

此代码调用split当前行上的方法。它在一周中的某一天四处分裂,看起来-1像“maxSplits”。这个负值告诉split方法在结果的行尾包含空字符串。否则,尽管该行"a b c Monday "将按预期返回一个长度为 2 的数组 ( ["a b c ", " "]),但该行"a b c Monday"(末尾没有空格)将返回一个长度为 1 的数组,因为最后一项将为空。

一旦我们在一周中的每一天都有正确的数组拆分,我们计算其中的项目数并减去一个以获得实际的出现次数。这始终是合法的,因为我们的数组将具有的最小大小为 1(在没有发生拆分的情况下,因此原始 String 是返回数组中的唯一元素)。

于 2013-03-06T20:35:54.847 回答
0

DayCount 类的规范是什么?在不知道的情况下很难弄清楚代码的意图是什么。

无论如何,您可以使用 contains 方法确定一行是否包含星期几;

if(sCurrentLine.contains("Monday") || sCurrentLine.contains("Tuesday") || ...) then ...

于 2013-03-06T20:07:02.977 回答