为什么这段代码在Java11中不能正常工作?与PriorityQueue和Comparable有关

问题描述 投票:0回答:1

我有一个很大很大的严重问题...我无法在脑海中解决这个问题。 所以我写了这篇文章。

我想将一个 Player 对象添加到优先级队列中。 但是这个priorityQueue不允许添加已经存在的rank对象。 所以我创建了一个类似的代码

class Player implements Comparable<Player>{
    int player;
    int rank;

    public Player(int player, int rank){
        this.player=player;
        this.rank=rank;
    }

    public int compareTo(Player p){
        if(this.rank<p.rank){
            return -1;
        } else if(this.rank==p.rank){
            throw new RuntimeException();
        } else{
            return 1;
        }
    }
}

如果我添加相同排名的玩家,则会抛出

RuntimeException

最后,当

RuntimeException
没有抛出时,这个队列就没有重复排名的玩家了。

然后,从队列中轮询一名玩家。 (所有队列的玩家都不重复。所以

RuntimeException
一定不会出现。)

相关代码是

try{
    //queue add
    for(int j=1;j<=n;j++){
        Player player=new Player(j,ranks[j]); //(player num, rank)
        queue.add(player);
    }

    //queue poll
    while(!queue.isEmpty()){
        Player player=queue.poll();
        sb.append(player.player).append(" ");
    }

} catch(Exception e){
    sb.append("IMPOSSIBLE");
}

但我有一个问题。添加所有数据后,当我从队列中轮询对象时,会出现

RuntimeException
。从逻辑上讲,
RuntimeException
不应该发生,因为当前队列不包含重复值。

大多数情况都是令人满意的,但在某些情况下会发生我刚才讲的逻辑飞跃。

我想知道我错过了什么。

java algorithm java-11 priority-queue comparable
1个回答
0
投票

当相同等级的玩家已经存在时,你应该返回 0,而不是抛出异常。

public int compareTo(Player p){
    if(this.rank<p.rank){
        return -1;
    } else if(this.rank==p.rank){
        return 0;
    } else{
        return 1;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.