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()
头值,从提供该值的流中获取下一个值,并将其放入队列中。
我将把它的实际编码留给你,但你的第一步是扔掉你目前正在做的事情,只要你能设法扔掉它。真的离你想做的差那么远
我通过使用 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()
头值,从提供该值的流中获取下一个值,并将其放入队列中。
我将把它的实际编码留给你,但你的第一步是扔掉你目前正在做的事情,只要你能设法扔掉它。真的离你想做的差那么远