我有一个很大很大的严重问题...我无法在脑海中解决这个问题。 所以我写了这篇文章。
我想将一个 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
不应该发生,因为当前队列不包含重复值。
大多数情况都是令人满意的,但在某些情况下会发生我刚才讲的逻辑飞跃。
我想知道我错过了什么。
当相同等级的玩家已经存在时,你应该返回 0,而不是抛出异常。
public int compareTo(Player p){
if(this.rank<p.rank){
return -1;
} else if(this.rank==p.rank){
return 0;
} else{
return 1;
}
}