>

제목에서 알 수 있듯이 여기 Packet 가 있습니다  클래스- packetNum 의 오름차순으로 정렬하려고합니다. :

public class Packet implements Comparable<Packet>{
    private short packetNum;
    private short authKey;
    private byte[] audio;
    public Packet()
    {
        packetNum = 0;
        authKey = 0;
        audio = null;
    }
    public Packet(short packetNum, short authKey, byte[] audio)
    {
        this.packetNum = packetNum;
        this.authKey = authKey;
        this.audio = audio;
    }
    @Override
    public int compareTo(Packet other) {
        int cmp = 0;
        if (this.packetNum < other.packetNum) {
            cmp = -1;
        }
        if (this.packetNum == other.packetNum) {
            cmp = 0;
        }
        else {
            cmp = 1;
        }
        return cmp;
    }
}

여기에 다른 클래스의 main 에있는 정렬 코드가 있습니다.  (while 루프 내부) :

//Packet constructed
Packet received = new Packet(packetNumReceived, authKeyReceived, encryptedAudio);
//Get packet num
short packetNum = received.getPacketNum();
//Hold block for reordering (16 packets)
ArrayList<Packet> block = new ArrayList<Packet>();
while (running) {
    //Add packet to ArrayList
    block.add(received);
    System.out.println(packetNum);
    //Re-order packets
    if (block.size() == 16) {
        Collections.sort(block);
        for (int i = 0; i < block.size(); i++) {
            //print out the sorted packet numbers
            System.out.println(block.get(i).getPacketNum());
            player.playBlock(block.get(i).getAudio());
        }
        block.clear();
    }
}

인쇄 된 패킷 번호는 정렬 전후에 동일한 (잘못된) 순서로 표시됩니다. 또한 배열 요소를 직접 확인했으며 순서는 전혀 변경되지 않았습니다. 이 코드 섹션은 Packet 클래스가 전혀 터치되거나 참조되는 유일한 시간이지만, 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 이것들은 저의 유일한 클래스이며 재사용 가능한 변수 이름은 없습니다.

  • 답변 # 1

    @Override
    public int compareTo(Packet other) {
        int cmp = 0;
        if (this.packetNum < other.packetNum) {
            cmp = -1;
        }
        if (this.packetNum == other.packetNum) {
            cmp = 0;
        }
        else {
            cmp = 1;
        }
        return cmp;
    }
    
    

    이 코드에서 this.packetNum == other.packetNum 인 경우1을 반환합니다.  -1을 반환하려는 경우에도 잘못된 정보를 제공합니다.

    다른 것을 잊었다 :

       (...) 
        else if (this.packetNum == other.packetNum) {
            cmp = 0;
        }
        (...)
    
    

  • 답변 # 2

    당신은 항상 1 를 반환합니다  때 packetNum   else if 가 없어서 일치하지 않습니다 .

    @Override
    public int compareTo(Packet other) {
        int cmp = 0; // default to zero
        if (this.packetNum < other.packetNum) {
            cmp = -1;  // set to -1 in one case
        } // MISSING ELSE!
        if (this.packetNum == other.packetNum) {
            cmp = 0;  // set to zero if equal
        }
        else {
            cmp = 1;  // set to 1 if NOT EQUAL!
        }
        return cmp;
    }
    
    

    다른 사람들이 지적했듯이 빼거나 Short.compare 를 사용하는 것도 사실입니다.  이 코드를 더 간결하고 읽기 쉽게 만들 것입니다.

  • 답변 # 3

    이미 코딩 된 코드를 작성하지 말고

    Short.compare(this.packetNum, other.packetNum);
    
    

    Javadoc

  • 이전 c# - datagridview의 아랍어 데이터를 데이터베이스에 저장
  • 다음 dockerfile - Docker에서 42 레이어 제한의 이유는 무엇입니까?