2017-12-25 20 views
2

buffer.getInt()로 다음 값을 읽어 PriorityQueue의 Comparator와 함께 버퍼를 사용하고 있습니다 (스트림 요소를 비교하기 위해). 불행히도, 다음에 그것을 비교할 때, 나는이 값을 잃어 가고 있습니다. 그래서, int에서 java의 버퍼로 돌아갈 수 있습니까? 나는 putInt와 같은 매끈함을 시도했지만 그것은 다르다. 미리 감사드립니다.Java int를 buffer.getInt로 반환합니다.

내가 정렬

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 readNext :

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

+0

코드를 표시하십시오. https://stackoverflow.com/help/mcve – ThomasEdwin

+0

@ThomasEdwin이 추가되었습니다. 가장 큰 문제는 스트림에서 두 값을 비교하는 방법입니다. 이제 나는 그것을 할 수 있고 느슨한 가치를 가질 수있다. 값을 버퍼로 되돌릴 수 있기를 바랍니다. – Luno

답변

1

MapInp의 정의는 표시하지 않지만 분명히 readNext이라는 방법이 있습니다. 그 메소드의 이름은 iterator의 일종을 발전시킬 것을 제안한다. 반복자는 앞으로 나아 간다.

heap.peek()은 대기열을 방해하지 않고 PriorityQueue<MapInp>에서 최상위 항목을 반환합니다. 아마도 t 값을 얻으려면 MapInp.readNext() 이외의 다른 방법을 호출해야 할 것입니다.

의견에 따르면 readNext이 작동하는 경우 놀랄 것입니다. 고객님의 의견은 so, here I am comparing values and loosing the value입니다.

+0

MapInp는 매핑을위한 맞춤 클래스입니다. 다른 기능은 없습니다. 아마,이 수업에서 매끈함을 바꿀 필요가 있습니다. – Luno

+0

합리적인 것으로 들립니다. 이 대답을 수락하십시오. –

+0

감사합니다. 어쨌든 MappedByteBuffer에 값을 반환 할 수 있습니까? – Luno

0

규칙 (Comparator)을 위반하고 있지만 크기를 줄이자.

Comparator에는 의 부작용이 없어야합니다..

compare() 메서드가 호출되는 방법과 방법을 제어 할 수 없으므로 메서드가 "다음"값을 어딘가에서 읽는 것이 완전히 잘못되었습니다!

요소가 추가 될 때 PriorityQueue의 순서가 설정됩니다. 정렬 순서에 영향을주는 요소의 값을 큐의 일부로 변경하는 것은 허용되지 않습니다.

완전히 잘못하고 있습니다. N 개의 값 스트림이있는 경우 (각각 병합 정렬에 필요함) 각 스트림을 개별적으로 정렬 한 다음 각 스트림에서 첫 번째 값을 읽고 대기열에 추가합니다. 그런 다음 poll​() head 값은 해당 값을 제공하는 스트림에서 다음 값을 가져 와서 큐에 넣습니다.

나는 실제 코딩을 그대로 남겨 두겠다.하지만 당신의 첫 번째 단계는 당신이 던져 버릴 수있는 한 당신이 현재하고있는 것을 버리는 것이다. 정말로 당신이하고 싶은 것과는 거리가 멀습니다.

+0

감사합니다. 그렇습니다.이 미리 정렬 된 스트림을 대기열에 저장 한 다음 외부 병합 알고리즘에 따라 하나의 파일에 병합합니다. 문제는 내가이 파일을 채울 때 값을 잃어 버리는 것입니다.이 비교 때문에 발생한다는 것을 알았습니다 (그래서 두 스트림의 다음 값을 읽고 위치를 변경하고 있습니다). poll()을 사용하려고 시도했지만 더 많은 값을 가져오고 결과에 null이 모두있는 것처럼 보입니다. – Luno

+0

전체 코드를 알려 드릴 수 있습니까? – Luno

+0

@ 루노 그 요점은 무엇입니까? 코드를 버려야합니다. 그것은 나쁜. Comparator는 비교되는 객체를 변경해서는 안되며'next()'를 호출하는 것은 수정이다. * 당신이하고있는 일을 다시 생각해보십시오. – Andreas