1

ここで一度に 2 つの別々の質問をしていることに気付きましたが、それらは関連していると思います (わずかではありますが)。とにかく、私がやりたいことは、文字列の 2 つのリスト (必ずしも Java リストではない) を比較し、両方のリストに含まれる単語を削除することです。リストが順序付けされていないため、 anArrayListまたは aHashSetHashSet優先して使用することを考えていましたが、HashSet に関する私の問題は、それらが重複を許可しないことを読んだことです。これは、各単語が出現する回数を数えることができるようにしたいが、それらを一度だけ表示したいので、私の他の要件とわずかに矛盾します...それが理にかなっている場合。WordCloud の例を考えてみてください。

これが私が現在持っているもので、2つのテキストファイルの内容を2つArrayListのに保存しています:

ArrayList<String> words = new ArrayList<String>();
        File file = new File(fileName);
        Scanner scanner = new Scanner(file).useDelimiter("$");
        while(scanner.hasNext())
        {               
            String wrd = scanner.nextLine();
            words.add(wrd);
        }

2 つのテキスト ファイルの構造が異なるため、2 つの異なる方法でデータを保存する必要がありました。

ArrayList<String> webWords = new ArrayList<String>();
    File webFile = new File(webFileName);
    BufferedReader br = new BufferedReader(new FileReader(webFileName));
    String testLine = "", str = "";
    int count = 0;
    String s;
    while ((testLine = br.readLine()) != null) {
            str += testLine + " ";
    }
    StringTokenizer st = new StringTokenizer(str);
    while (st.hasMoreTokens()) {
            s = st.nextToken();
            webWords.add(s);
            count++;
    }

これで、同様の方法で 2 つの HashSet を簡単に作成できるようになりましたが、今のところ ArrayList を使用しています。これにより重複が可能になり、どちらが自分のニーズに最も適しているかまだわかりません。

2 番目のリストと 1 番目のリストを比較し、1 番目のリストに表示される 2 番目のリストのすべての単語を削除する必要があります。

私の 2 番目の問題は、(一般的な単語を削除した後で) どの単語が最も頻繁に発生するかを判断しようとすることです。

どんな助けや指示も大歓迎です。

4

3 に答える 3

3

要件を正しく理解していれば、リスト1のHashMap<String, Integer>すべての単語をキーとして取得できるため、重複を避けることができます。

for(String w : list1) {
      map.put(w, 0);
}

次に、マップエントリを反復処理し、単語の頻度をカウントして、エントリ値として配置できます。

for(Entry<String, Integer> e : map.entrySet) {
      int n = Collections.frequency(list2, e.getKey());
      e.setValue(n);
}

更新:「list1に表示されるlist2から単語を削除できるようにしたい。次に、list2の残りの単語を繰り返し処理して、各単語が何回出現するかを調べます。」

   list2.removeAll(list1);

   for(String w : list2) {
          map.put(w, 0);
    }

    for(Entry<String, Integer> e : map.entrySet) {
          int n = Collections.frequency(list2, e.getKey());
          e.setValue(n);
    }
于 2013-01-09T15:59:26.937 に答える
1

別のコレクションに存在する1つのコレクションのすべての要素を削除するには、を使用しますremoveAll。これはコレクションインターフェイスのオプションの操作であり、ArrayListとHashSetの両方が実装します。

words.removeAll(webWords);

度数分布表を作成するには、セットを使用してはなりません。セットは各要素の1つだけを保持するためです。リストを使用してを作成し、Map<String, Integer>各単語を出現回数にマッピングすることをお勧めします。それを構築するには、次のようなことを行うことができます。

for (String word : words) {
    if (freqMap.containsKey(word)) {
        freqMap.put(word, freqMap.get(word) + 1); // increment
    } else {
        freqMap.put(word, 1); // begin at 1 if it was not present
    }
}
于 2013-01-09T15:48:13.773 に答える
0

用語とカウントを組み合わせる簡単な方法は、単語をキーとして、出現回数を値としてHashMapを使用することです。Javaの正確な表記法は思い出せませんが、次のようなものが期待できます。

HashMap words = new HashMap();
while ( st.hasMoreTokens())
{
   s = st.nextToken();
   if ( words.containsKey(s) )
    {
        // probably not how indexing is done, but would be in most languages :p
        words[s]= words[s]+1;
     }
   else 
     {
       words.put( s, 1 );
     }
}

そうすれば、すべての一意の単語のHashMapと、それぞれの出現回数が得られます。

于 2013-01-09T15:48:02.437 に答える