3

ログ ファイルを読み取り、特定の文字列が表示された回数をカウントするプログラムを作成しています。文字列をキーワードとして手動で入力しようとしていましたが、非常に多いため、ログ ファイルを検索した方がよいと判断し、「ua」に遭遇すると、「ua」から「ua」への新しい文字列を作成する必要があります。行の終わり、それをハッシュマップに追加し、その特定の文字列の数を増やします(私が興味を持っているすべての文字列は「ua、」で始まります)。新しい文字列をハッシュマップに追加する方法がわかりません。これは私がこれまでに持っているものです。

public class Logs
{

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

 Map<String, Integer> dayCount = new HashMap<String, Integer>();
    for (String str : KeyWords)
    {
        dayCount.put(str, 0);
    }

    File path = new File("C:\\P4logs"); 
    for(File f: path.listFiles())
    { // this loops through all the files + directories

        if(f.isFile()) 
        { // checks if it is a file, not a directory.

    try (BufferedReader br = new BufferedReader(new FileReader(f.getAbsolutePath())))
    {


String sCurrentLine;

while ((sCurrentLine = br.readLine()) != null) 
{
    boolean found = false;

    for (String str : DayCount.keySet()) 
    {
        if (sCurrentLine.indexOf(str) != -1)
        {
            DayCount.put(str, DayCount.get(str) + 1);
            found = true;
            break;
        }
     }
     if (!found && sCurrentLine.indexOf("ua, ") != -1)
     {
        System.out.println("Found an unknown user action: " + sCurrentLine);
        DayCount.put(key, value)    //not sure what to put here
     }
    }
   }
 for(String str : KeyWords)
    {
         System.out.println(str + " = " + DayCount.get(str));

    }

    }
   }
}

}

4

2 に答える 2

7

存在するかどうかを確認するために、ハッシュマップのキーを反復処理する必要はありません! これは、ハッシュマップを使用する目的を無効にします (O(1)衝突のないルックアップO(n)とソリューション内のルックアップ)。次のようなことだけを行う必要があります。

//If a key doesn't exist in a hashmap, `get(T)` returns null
if(DayCount.get(str) == null) {
    //We know this key doesn't exist, so let's create a new entry with 1 as the count
    DayCount.put(str, 1);
} else {
    //We know this key exists, so let's get the old count, increment it, and then update
    //the value
    int count = DayCount.get(str);
    DayCount.put(str, count + 1);
}

別の注意として、Java 命名規則に従うことを検討してください。変数は小文字で始める必要があります (例: dayCountvs DayCount)。クラスのみ大文字で始める必要があります。あなたが今持ってDayCountいる方法は、と呼ばれる静的メソッドを持つクラスのように見えputます。

于 2013-03-12T17:26:46.517 に答える
0

これはあなたの要件であるため -

it should create a new string from "ua, " to the end of the line

行頭が「ua」なのか「ua」なのか不明なため、行の途中にある可能性があります。これはおそらくどのように見えるべきか -

  while ((sCurrentLine = br.readLine()) != null) 
    {

        if( sCurrentLine.indexOf("ua, ") != -1 ){
             String str = sCurrentLine.substr("ua, ");
             if(dayCount.get(str) != null){
                  dayCount.put(str, dayCount(str) +1 );
              }else{
                  dayCount.put(str, 1 ); 
              }
        }

    }
于 2013-03-12T17:40:16.630 に答える