java求topk_topk问题java实现

topk问题是一个经典的问题,下面分别采用最小堆和guava来解决这个问题:

采用最小堆:

import com.google.common.base.Splitter;

import com.google.common.collect.HashMultiset;

import com.google.common.collect.Multiset;

import com.google.common.primitives.Ints;

import org.apache.commons.io.FileUtils;

import java.io.File;

import java.io.IOException;

import java.nio.charset.Charset;

import java.util.*;

/**

* Created by fhqplzj on 17-2-16 at 下午9:57.

*/

public class My4 {

public static void main(String[] args) throws IOException {

String path = "/home/fhqplzj/IdeaProjects/DocumentClustering/src/resources/data/ap";

String s = FileUtils.readFileToString(new File(path), Charset.defaultCharset());

Iterable words = Splitter.onPattern("\\W+").omitEmptyStrings().split(s);

HashMultiset hashMultiset = HashMultiset.create(words);

Set> entries = hashMultiset.entrySet();

int k = 10;

Comparator> comparator = (o1, o2) -> Ints.compare(o1.getCount(), o2.getCount());

PriorityQueue> priorityQueue = new PriorityQueue<>(comparator);

for (Multiset.Entry entry : entries) {

if (priorityQueue.size() < k) {

priorityQueue.offer(entry);

} else if (priorityQueue.size() == k && comparator.compare(priorityQueue.peek(), entry) < 0) {

priorityQueue.poll();

priorityQueue.offer(entry);

}

}

ArrayDeque> arrayDeque = new ArrayDeque<>();

while (!priorityQueue.isEmpty()) {

arrayDeque.push(priorityQueue.poll());

}

arrayDeque.forEach(System.out::println);

}

}采用guava的ordering类:

import com.google.common.base.Function;

import com.google.common.base.Splitter;

import com.google.common.collect.HashMultiset;

import com.google.common.collect.Multiset;

import com.google.common.collect.Ordering;

import org.apache.commons.io.FileUtils;

import javax.annotation.Nullable;

import java.io.File;

import java.io.IOException;

import java.nio.charset.Charset;

import java.util.List;

import java.util.Set;

/**

* Created by fhqplzj on 17-2-19 at 下午4:02.

*/

public class My2 {

public static void main(String[] args) throws IOException {

String path = "/home/fhqplzj/IdeaProjects/DocumentClustering/src/resources/data/ap";

String s = FileUtils.readFileToString(new File(path), Charset.defaultCharset());

Iterable words = Splitter.onPattern("\\W+").omitEmptyStrings().split(s);

HashMultiset counter = HashMultiset.create(words);

Set> entries = counter.entrySet();

Ordering> ordering = Ordering.natural().onResultOf(new Function, Integer>() {

@Nullable

@Override

public Integer apply(@Nullable Multiset.Entry input) {

assert input != null;

return input.getCount();

}

});

List> result = ordering.greatestOf(entries, 10);

result.forEach(System.out::println);

}

}切忌重复造轮子,以后用guava来解决这一问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值