Java Return 整型到 buffer.getInt

Java Return int into buffer.getInt

我通过使用 buffer.getInt() 读取下一个值来使用带有 PriorityQueue 比较器的缓冲区(比较流的元素)。不幸的是,当我下次比较它时,我失去了这个价值。 那么,是否可以将 return int 返回到 java 中的缓冲区? 我试过 putInt 之类的东西,但它是不同的.. 提前致谢。

我正在实施外部合并排序

package sort;
import java.util.Comparator;
import inputStream.Mapping.*;

public class extComparator implements Comparator<MapInp>{

    @Override
    public int compare(MapInp o1, MapInp o2) {
        Integer a = o1.readNext();
        Integer b = o2.readNext();
        return a.compareTo(b);
    }
}

然后,我在另一个文件中使用它:

heap = new PriorityQueue<MapInp>(numOfFilesNM/d, new extComparator());
heap.add(new MapInp("data/inp.data"));
....
int t = heap.peek().readNext(); //so, here I am comparing values and loosing the value

MapInt 读取下一个:

public int readNext() {
    if(fileLen-pos-lastPos>bufSize) bufCap = bufSize;
    else bufCap = (int) (fileLen-pos-lastPos);
    if(buffer.position()==buffer.capacity()) {
        lastPos+=pos;
        buffer.clear();
    try {
        buffer = inpCh.map(FileChannel.MapMode.READ_ONLY, lastPos,bufCap);
    }
    catch (IOException e) {
    e.printStackTrace();
    }
    pos=0;
    }
    pos+=4;
    return buffer.getInt();
}

不幸的是,我仍然没有解决它。抱歉,但可能共享整个代码会更好:https://www.dropbox.com/s/zqceyg8j6u9kvg7/test.zip?dl=0

你没有显示MapInp的定义,但显然它有一个方法叫做readNext。该方法的名称表明它推进了某种迭代器。迭代器向前移动。

heap.peek() returns PriorityQueue<MapInp> 中的顶部项目,而不会打扰队列。可能您需要调用 MapInp.readNext() 以外的其他方法来获取 t.

的值

顺便说一句,您的评论 so, here I am comparing values and loosing the value 似乎不正确,因为如果 readNext 根据评论运行我会感到惊讶。

您违反了 Comparator 每条 规则,但让我们减少它的大小。

Comparator 必须没有副作用

您无法控制 compare() 方法的调用方式和时间,因此让该方法从某处读取 "next" 值是完全错误的!!!

PriorityQueue 的顺序是在添加元素时建立的。当元素是队列的一部分时,您不得以影响排序顺序的方式更改元素的值。

你完全错了。如果您有 N 个值流,每个值都是单独排序的(因为您需要进行合并排序),然后从每个流中读取第一个值并添加到队列中。然后poll​()头值,从提供该值的流中获取下一个值,并将其放入队列中。

我将把它的实际编码留给你,但你的第一步是扔掉你目前正在做的事情,只要你能设法扔掉它。真的离你想做的差那么远