Java 查找与k大元素对应的值

Java 查找与k大元素对应的值,java,external-sorting,Java,External Sorting,我的问题是关于一个大文件中的数据 我有一个巨大的文件,它的格式是Primary_key Value( 例:10000001 10000002 5 1000009200等。 我想在primary_key列中找到与k-large元素对应的值。例如:如果k=2,它应该按照上面的示例输出200和5 由于它是一个非常大的文件,我计划使用最小堆方法,对此我非常了解。但是,我的数据是在一个键值对中,我不知道如何在最小堆排序中使用它 关于如何实现这一点的任何建议。非常感谢在这方面的任何帮助。是的,您的方法是正确

我的问题是关于一个大文件中的数据

我有一个巨大的文件,它的格式是Primary_key Value( 例:10000001 10000002 5 1000009200等。 我想在primary_key列中找到与k-large元素对应的值。例如:如果k=2,它应该按照上面的示例输出200和5

由于它是一个非常大的文件,我计划使用最小堆方法,对此我非常了解。但是,我的数据是在一个键值对中,我不知道如何在最小堆排序中使用它


关于如何实现这一点的任何建议。非常感谢在这方面的任何帮助。

是的,您的方法是正确的,您可以使用优先级队列(带最小堆)来实现这一点。您可以将数据存储在映射中,然后在优先级队列中使用它,如下所示

PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>((a, b) -> a.getValue()-b.getValue());
//psuedo code
for (line in file)
{ 
    //line[0] - denotes key and line[1] - denotes value
    count = map.getOrDefault(line[0], 0);
    map.put(num, count+line[1]);
}
for(Map.Entry<Integer, Integer> entry : counterMap.entrySet()) {
    pq.offer(entry);
    if(pq.size() > k) 
     pq.poll();
}

List<Integer> res = new LinkedList<>();
while(!pq.isEmpty()) {
    res.add(0, pq.poll().getValue());
}
return res;
PriorityQueue pq=newpriorityqueue((a,b)->a.getValue()-b.getValue());
//伪代码
用于(文件中的行)
{ 
//第[0]行表示键,第[1]行表示值
count=map.getOrDefault(第[0]行,0);
map.put(num,count+line[1]);
}
for(Map.Entry:counterMap.entrySet()){
pq.报价(条目);
如果(pq.size()>k)
pq.poll();
}
List res=new LinkedList();
而(!pq.isEmpty()){
res.add(0,pq.poll().getValue());
}
返回res;

非常感谢您的回复。但是我还是有点卡住了。所以我想我会和您一起检查我的算法,然后执行步骤1。逐个读取文件中的行。步骤2:创建一个大小为k的最小堆(当您找到k个大元素时),而(br.ready()&&(s=br.readLine())!=null){Integer j=Integer.parseInt(s) ;System.out.println(j+“/n”);for(int i=0;iI在我的回答中添加了完整的伪代码,我假设您的密钥在文件中可能有多个条目,并且必须基于同一个密钥对条目求和。希望这会有所帮助。再次感谢。我正在将元素添加到优先级队列中,名为minHeap.add(instructors.entrySet());但是我得到了一个错误:类型PriorityQueue中的add(Map.Entry)方法不适用于参数(Set)。您能提供帮助吗?您可以尝试minHeap.addAll(instructors.entrySet())吗?如果不起作用,请检查此链接中的此答案?如果有效,请告诉我!