我试图编写一个程序来检索特定用户的推文并计算最常用的单词。在我的代码中,除了重复次数之外,我还会在用户时间线中写下每个单词。但我只需要获得最常用的单词和计数。
如何修复我的代码呢?
for(Status status2 : status){
status2.getText();
//System.out.println(status2.getCreatedAt());
String s = status2.toString();
String[] splitted = s.split(" ");
HashMap hm = new HashMap();
int x;
for (int i = 0; i < splitted.length; i++) {
if (!hm.containsKey(splitted[i])) {
hm.put(splitted[i], 1);
} else {
hm.put(splitted[i], (Integer) hm.get(splitted[i]) + 1);
}
for (Object word : hm.keySet()){
System.out.println(word + " " + (Integer) hm.get(word));
}
}
}
答案 0 :(得分:2)
我使用list
个String
变量进行了此操作,但相同的概念适用于推文。只需遍历每条推文并获取消息所在的String
,而不是循环遍历String
对象中的List
变量。
map
。当您在loop
内初始化它时,它将为每条推文重新创建地图。这将删除您找到的所有数据。map
以外的值。否则,您将在每个推文迭代中输出数据。这可能是期望的结果,但从我收集到的不是你想要的。foreach
循环来循环分割数组。无需为int
计数器使用额外的内存。结果的问题在于您在每次迭代中重新创建地图,从而消除了以前的所有数据。如果在循环之前初始化地图,并且不重新初始化每次迭代,则可以在所有推文中跟踪数据。这样做的例子是:
public static void main(String[] args) throws Exception {
List<String> statusTweets = new ArrayList<String>();
statusTweets.add("At the bar");
statusTweets.add("At the house");
statusTweets.add("Out with friends");
Map<String,Integer> wordHits = new HashMap<String,Integer>();
for(String status : statusTweets){
String[] statusSplitOnSpace = status.split(" ");
for(String wordInStatus : statusSplitOnSpace){
if (!wordHits.containsKey(wordInStatus)) {
wordHits.put(wordInStatus, 1);
} else {
wordHits.put(wordInStatus, wordHits.get(wordInStatus)+1);
}
}
}
for(Entry<String,Integer> wordHit : wordHits.entrySet()){
System.out.println("Word (" + wordHit.getKey() + ") was found " + wordHit.getValue() + " times.");
}
}
循环后,您可以使用找到的数据执行所需操作。找到更高的单词数,删除某些单词等。我只是做了一个循环来输出结果。这给了我:
Word (the) was found 2 times.
Word (with) was found 1 times.
Word (bar) was found 1 times.
Word (At) was found 2 times.
Word (house) was found 1 times.
Word (friends) was found 1 times.
Word (Out) was found 1 times.