我有一个
Iterator<Text> values
每个文本都包含句点/类型对。
看上去像这样
早间短信
晨声
早间短信
早间短信
晨声
日短消息
日音
晚间短信
晚音
晚间短信
晚音
晚间短信
晚音
晚间短信
晚音
夜间短信
夜声
夜间短信
夜声
有没有一种方法可以计算在没有很多其他块的情况下一对出现多少次?
结果应该是
凌晨3点短信
凌晨2点
1天短信
1天语音
3晚短信
3晚声
2夜之声
2夜之声
发布于 2016-10-14 08:38:40
首先,使用HashMap<Text,Integer>
跟踪每个不同的句点/类型对,其中Text
是key
,Integer
是value
,value
是频率。
HashMap<Text,Integer> m = new HashMap<Text,Integer>();
//Populate the HashMap
while(values.hasNext())
{
Text element = values.next();
if(m.get(element) == null)
{
m.put(element , 1);
}
else m.put(element , m.get(element) + 1);
}
//Display the frequencies
for (Map.Entry<Text, Integer> entry : m.entrySet())
{
System.out.println(entry.getValue() + "/" + entry.getKey().period );
}
我假设Text
是一个类,它的公共字段名为period
,包含类似于morning sms
的字符串。
发布于 2016-10-14 08:25:44
为此,请使用Streams.collect:
List<String> values = new ArrayList<>();
values.add("morning");
values.add("evening");
values.add("morning");
// Function.identity() means p->p, since example collection is very simple
// If your objects are more than strings, you'll need to map them: p -> p.getName(), for example
Map<String, Long> collect =
values.stream().collect(groupingBy(Function.identity(), counting()));
System.out.println(collect);
发布于 2016-10-14 08:35:00
你能做到的
HashMap<String, Integer> maps = new HashMap<>();
while(itr.hasNext()) {
Object element = itr.next();
Integer i = maps.get(element.toString());
if(i == null) {
maps.put(element.toString(), 1);
}
else {
maps.put(element.toString(), ++i);
}
}
//See result
for(Entry<String, Integer> e : maps.entrySet()) {
System.out.println(e.toString());
}
https://stackoverflow.com/questions/40038295
复制相似问题