2017-11-29 16 views
-1

私は、ファイル内の各単語の出現回数をカウントし、それらをマップに入力するためのJavaプログラムを実行しています。私はスレッドの概念を使用しています。スレッドがマップ内の単語と一致しないのはなぜですか?

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.LinkedHashMap; 
import java.util.Map; 



class MyThread1 extends Thread 
{ 
    String word; 
    int len,position; 
    String[] wordlist; 
    MyThread1(String word, int len,int position, String[] wordlist) 
    { 
     this.word=word; 
     this.len=len; 
     this.position=position; 
     this.wordlist=wordlist; 
    } 
public void run() 
{ 
    int i=position,y,count=0; 

     synchronized(this){ 
      Map<String,Integer> m=new LinkedHashMap<String,Integer>(); 

      if(m.containsKey(word)) 
     { 
      System.out.println("Duplicate entry - bypassing it"); 
     } 
     else{ 
     y=i+1; 
     count=1; 
     for(int j=y;j<len;j++) 
     { 
      if(word.equals(wordlist[j])) 
       count++; 
     } 
     /* if(m.containsKey(word)) 
     { 
      int l=m.get(word); 
      System.out.println("word is "+word); 
      System.out.println("existing count "+l); 
      System.out.println("current count "+count); 
      if(l>count) 
      { 
       m.put(word, l); 
      } 
      else 
      { 
       m.put(word,count); 
      } 
     } */ 
     m.put(word,count); 
      count=0; 
     } 

       for(Map.Entry<String,Integer> me:m.entrySet()) 
       { 
        System.out.println(me.getKey()+" "+me.getValue()); 
       } 
     } 
    } 
} 


public class UsingThread 
{ 
public static void main (String args[]) throws IOException 
{ 
    File f1=new File("C:/Users/sahithim/Desktop/file1.txt"); 
    FileReader fr=null; 
    int x; 
    String s="",eachEntry=""; 
    try { 
     fr=new FileReader(f1); 
     while((x=fr.read())!=-1) 
     { 
      s=s+(char)x; 
     } 
    } 
    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     fr.close(); 
    } 

    String[] wordArray=s.split(" "); 
     int num_0f_words=wordArray.length; 
     for(int i=0;i<num_0f_words;i++) 
     { 
      eachEntry=wordArray[i]; 
      MyThread1 mt1=new MyThread1(eachEntry,num_0f_words,i,wordArray); 
      mt1.start(); 
     } 



} 
    } 

これは私が各単語をスレッドに送り、その存在を地図で確認しています。たとえ単語が地図に存在しても、それを認識していません。

私は私がやっている間違いですこれは何

hello 6 
this 6 
hey 24 
    1 
is 6 
pallavi 6 
nalam 6 
hey 23 
hey 22 
hey 21 
sahithi 
    6 
i 12 
am 6 
good 6 
i 11 
love 6 
flowers 
    6 

    6 
hey 20 
hello 5 
this 5 
is 5 
pallavi 5 
nalam 5 
hey 19 
hey 18 
hey 17 
sahithi 
    5 
am 5 
i 10 
good 5 
i 9 
love 5 

    5 
flowers 
    5 
hey 16 


    1 
flowers 
    1 
is 4 
i 1 
this 4 
good 1 

    1 
am 1 
love 1 
sahithi 
    1 
i 2 
hey 2 
hey 1 
i 4 
i 3 
nalam 1 
this 1 
is 1 
hey 4 
hello 1 
love 2 

    2 
am 2 
flowers 
    2 
good 2 
hey 5 
sahithi 
    2 
hey 7 
hey 6 
nalam 2 
pallavi 2 
is 2 
this 2 
hey 8 
love 3 
i 5 

    3 
am 3 
sahithi 
    3 
hello 2 
nalam 3 
hey 11 
pallavi 3 
this 3 
hello 3 
hey 10 
hey 9 
i 6 
good 3 
flowers 
    3 
pallavi 1 
hey 3 
hello 4 
pallavi 4 
nalam 4 
hey 15 
hey 14 
sahithi 
    4 
hey 13 
i 8 
am 4 
good 4 

    4 
i 7 
love 4 
hey 12 
flowers 
    4 
is 3 

のようないくつかのことを印刷している。この

hey 24 
hello 6 
this 6 
is 6 
pallavi 6 
nalam 6 
sahithi 
    6 
i 12 
am 6 
good 6 
love 6 
flowers 6 

のような出力を期待していますか?必要な出力を得るには?

+0

これは疑問ではありませんが、他人がコードを書くことを求めるリクエストです。単語ごとに1つのスレッドではなく、単語の出現ごとに1つのスレッドを開始します。 – tkruse

+0

@tkruse私は自分の仕事を他の人に任せるつもりはない。私はコードを修正し、必要な出力を得ました。 – sahithi

答えて

0

単語ごとに1つのスレッドではなく、単語の出現ごとに1つのスレッドを開始します。

0

これは私が各単語をスレッドに送り、その存在を地図で確認しています。たとえ単語が地図に存在しても、それを認識していません。

あなたはそれぞれ、すべての単語のための新しいLinkedHashMapを作成新しいスレッドに言葉を送っています。 mainメソッドで割り当てた1つのLinkedHashMapを使用したいと考えています。

Map<String,Integer> wordMap = new LinkedHashMap<String,Integer>(); 
... 
MyThread1 myThread = new MyThread1(eachEntry, num_0f_words, i , wordArray, wordMap); 
// then use this external map inside of the `run()` method 

しかし、あなたはそれぞれ、すべての単語のための新しいスレッドを作成している場合、これは本当にThreadの良い使用のようには見えません。しかし、これはある種の学問的練習なのでしょうか?

関連する問題