2012-12-16 38 views
1

我似乎碰到了一个凹凸。我正在为minecraft bukkit服务器创建一个“经济”系统。Java mysql十进制排序错误

我试图先订购“富豪”表,但收到的订单是不同的。当我通过phpmyadmin运行SQL它是在正确的顺序

enter image description here

enter image description here

public static HashMap<String, Double> topPlayers(String economyKey) { 
    sql.build("SELECT b.balance, p.username FROM " + sql.prefix 
      + "players p INNER JOIN " + sql.prefix + "balances b ON p.id=b.user_id WHERE economy_key=? ORDER BY b.balance DESC LIMIT 0,5"); 
    String[] params = { economyKey }; 

    ResultSet results = sql.executePreparedQuery(params); 
    HashMap<String, Double> players = new HashMap<String, Double>(); 
    try { 
     while (results.next()) { 
      players.put(results.getString("username"), results.getDouble("balance")); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    return players; 
} 
+0

如果您的方法可以轻松切换到['LinkedHashMap'](http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html),该维护插入顺序返回接口('Map')而不是实现('HashMap',其顺序是不可预知的)。 –

回答

3

你正在使用的不是有序的HashMap收到。尝试使用List或任何其他有序的数据结构 - 它会解决您的问题。

+0

你是对的,我在while循环内输出到控制台,它确实输出它。我认为散列表将按照首先放置的内容排序。谢谢! –

+1

linkedhashmap也会这样做 –

2

您正在使用不调整元素排序的HashMap

这什么java.util.HashMap API文档说:

此类不作任何保证,而地图的顺序;特别是,它不能保证订单会随着时间的推移保持不变。

你还是去实现SortedMap接口是一张地图,进一步提供关于键的总体排序的具体类。

例如,TreeMap就足够了,因为它实现了SortedMap接口。

+0

由于目的是以有序的方式遍历所有项目并打印它们 - 不需要HashMap - 一个简单的LinkedList就可以完成。 – alfasin

+0

,但是op希望玩家的名字和得分一起,所以我认为。 – Abubakkar

+0

一个简单的字符串连接会做的工作(球员是一个LinkedList): 'players.add(results.getString(“username”)+“”+ results.getDouble(“balance”));' – alfasin