Java将int返回到buffer.getInt

Java将int返回到buffer.getInt,java,buffer,Java,Buffer,我通过使用buffer.getInt()读取下一个值,将buffer与PriorityQueue的Comparator一起使用(用于比较流的元素)。不幸的是,当我下次比较它时,我失去了这个值。 那么,在java中是否可以将int返回到缓冲区? 4.我试过用电脑打字,但不一样。。 提前谢谢 我正在执行外部合并排序 package sort; import java.util.Comparator; import inputStream.Mapping.*; public class extCom

我通过使用buffer.getInt()读取下一个值,将buffer与PriorityQueue的Comparator一起使用(用于比较流的元素)。不幸的是,当我下次比较它时,我失去了这个值。 那么,在java中是否可以将int返回到缓冲区? 4.我试过用电脑打字,但不一样。。 提前谢谢

我正在执行外部合并排序

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);
    }
}

不幸的是,我仍然没有解决这个问题。很抱歉,共享整个代码可能会更好:

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

heap.peek()
PriorityQueue
返回顶部项目,而不干扰队列。您可能需要调用
MapInp.readNext()以外的其他方法来获取
t
的值

顺便说一句,您的注释
因此,我在这里比较值并丢失值
似乎不正确,因为如果
readNext
根据注释起作用,我会感到惊讶。

您违反了a的每一条规则,但让我们将其缩减为大小

比较器
必须具有无副作用

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

随着元素的添加,将确定a的顺序。当元素是队列的一部分时,不允许以影响排序顺序的方式更改元素的值

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


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

请显示代码@汤玛斯温补充道。主要问题是如何比较流中的两个值。现在我可以做到这一点,放松价值观。我希望可以将该值返回到缓冲区中。MapInp是用于映射的自定义类。没有其他功能。也许,我需要在这节课上换smth。谢谢。无论如何,是否可以将值返回到MappedByteBuffer?可以读取和写入MappedByteBuffer。再见,谢谢。是的,我将这些预先排序的流存储在队列中,然后将其合并到一个文件中(根据外部合并算法)。当我填充这个文件时,问题是丢失值-我发现这是因为这个比较(因此,我读取两个流的下一个值并更改其位置)。我尝试过使用poll(),但它会杀死更多的值,我收到的结果与所有的空值一样。@Luno这有什么意义?你必须扔掉你的代码。这很糟糕。
Comparator
不能修改被比较的对象,调用
next()
就是一种修改。你想想你在做什么。
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
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();
}