2014-09-21 98 views
2

我确实有一个User类,它实现了Comparable。在我将用户列表添加到PriorityQueue<User>之后,他们应该优先选择scores,但由于某些原因,他们不会。您能否帮我弄清楚为什么用户没有在我的Queue中排序?PriorityQueue命令不正确JAVA

更新:

我正在通过轮询元素访问队列。 prioritisedUsers.poll()它总是随订单尊重随机得分。

PriorityQueue<User> prioritisedUsers = userPriorityStrategy.computeUserPriority(users); 

while(!prioritisedUsers.isEmpty()){ 
    System.out.println(prioritisedUsers.poll().getPriorityScore()); 
} 

OUTPUT:

0.35036433736768735 
0.6619121139678329 
0.09520067929838127 
0.4013591573863 
0.6704568389588227 
0.5989900926939181 
0.7320779721160738 

感谢您的帮助!

public class User implements Comparable<User>{ 

    private long id; 
    private String fistName; 
    private String lastName; 
    private double priorityScore; 

    public User (long id, String firstName, String lastName){ 
     this.id = id; 
     this.fistName = firstName; 
     this.lastName = lastName; 
    } 

    public double getPriorityScore(){ 
     return this.priorityScore; 
    } 

    public void setPriorityScore(double priorityScore){ 
     this.priorityScore = priorityScore; 
    } 

    public long getId(){ 
     return this.id; 
    } 

    public String getFistName(){ 
     return this.fistName; 
    } 

    public String getLastName(){ 
     return this.lastName; 
    } 

    public int compareTo(User o) { 
     return (int) (this.getPriorityScore() - o.getPriorityScore()); 
    } 
} 


    public PriorityQueue<User> computeUserPriority(List<User> users) { 
     PriorityQueue<User> prioritisedUsers = new PriorityQueue<User>(users.size()); 
     for (User user : users) { 
      user.setPriorityScore(rand.nextDouble()); 
      prioritisedUsers.add(user); 
     } 
     return prioritisedUsers; 
    } 
+0

我跑在我的IDE评估查询'prioritisedUsers.poll()'总是随机得分。 – 2014-09-21 19:42:25

+0

我的不好,你是对的。 1+ – 2014-09-21 19:54:03

回答

5

我不太确定你的转换为(int)的效果不错......因为转换为int会隐式地丢弃任何小数。

如果我在错误的我不是,你可以试试

public int compareTo(User object) { 
if (this.getPriorityScore() < object.getPriorityScore()) 
    return -1; 
if (this.getPriorityScore() == object.getPriorityScore()) 
    return 0; 
return 1; 
} 

或可选择地和更简单:

public int compareTo(User o) { 
    return Double.compare(this.getPriorityScore(), o.getPriorityScore()); 
} 
+2

是的! 1+。或者更简单的做'返回Double.compare(priorityScore,o.priorityScore);' – 2014-09-21 19:51:23

+0

是的...更好(+1)...考虑我的只是作为一个教学方法,以更好的问题解释... – 2014-09-21 19:52:31

+0

我希望你不要不介意,但我添加它作为您的答案编辑。 – 2014-09-21 19:53:32