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には[行全体]という名前のキーが含まれていますか」と質問しています。ここで必要なのは、各行で各曜日のすべての出現をチェックすることです。これを行うための手っ取り早い方法は、その単語(たとえば、「月曜日」)の周りで文字列を分割し、結果のリストの長さを数えることです。

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);
    }
}

セットの反復処理で問題が発生しているため(これは謎ですが、元の質問の範囲外です)、次のように記述することもできます(コメントで述べたように、内部ループの変更に注意してください) )::

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を引いて、実際の発生数を取得します。配列の最小サイズは1であるため、これは常に有効です(分割が発生しない場合は、元の文字列が返される配列の唯一の要素です)。

于 2013-03-06T20:35:54.847 に答える
0

DayCount クラスの仕様は何ですか? それを知らないと、コードの意図が何であるかを理解するのは困難です。

とにかく、contains メソッドを使用して、行に曜日が含まれているかどうかを調べることができます。

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

于 2013-03-06T20:07:02.977 に答える