1

我意识到我在这里同时问了两个不同的问题,但我认为它们是相关的(即使只是轻微的)。无论如何,我想做的是比较两个字符串列表(不一定是 Java 列表)并删除两个列表中出现的单词。我正在考虑使用 anArrayList或 a HashSetHashSet因为列表没有排序,但我对 HashSet 的问题是我读过它们不允许重复。这与我的其他要求略有冲突,因为我希望能够计算每个单词出现的次数,但只显示一次……如果这有意义的话。想想一个 WordCloud 的例子。

这是我目前拥有的,将两个文本文件的内容保存到两个ArrayLists:

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

我不得不使用两种不同的方式来保存数据,因为这两个文本文件的结构不同

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

现在我可以轻松地以类似的方式创建两个 HashSet,但我目前正在使用 ArrayList,因为它允许重复,我仍然不确定哪个最适合我的需要。

我需要将第二个列表与第一个进行比较,并删除第二个列表中出现在第一个列表中的所有单词。

我的第二个问题是试图确定(在我删除常用词之后)哪些词最常出现。

任何帮助或方向将不胜感激。

4

3 回答 3

3

如果我正确理解了要求,那么我们可以将 aHashMap<String, Integer>并将 list1 中的所有单词作为键放入其中,从而避免重复

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

更新:“我希望能够从 list2 中删除出现在 list1 中的单词。然后遍历 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

要删除一个集合中存在于另一个集合中的所有元素,请使用removeAll. 这是 Collection 接口中的可选操作,ArrayList 和 HashSet 都实现了它。

words.removeAll(webWords);

要构建频率表,您不能使用集合,因为集合只保留每个元素中的一个。您需要使用 List 并创建一个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 回答