2013-09-23 25 views
1

我想排序一些数据。目前数据存储在地图中。我知道,我无法按照价值对地图中的数据进行排序。我计算足球赛程这样的:Android:HashMap按3个值排序

TeamName,G +,G-,P

我想先用P排序,然后由G +,然后通过G-。

每一个K,V是在一个地图是这样的:

map.put(e.getString("team_id"), 0);  
map.put(e.getString("team_id")+"G+", 0); 
map.put(e.getString("team_id")+"G-", 0); 

我知道数据结构实在是太差了!我认为最好是将这些值写入Collection来执行collection.sort。但我该怎么做?

这里是我的代码(代码工作正常,但未经分类和编码错误的):

HashMap<String, Integer> map = new HashMap<String, Integer>(); 
HashMap<String, String> tab = new HashMap<String, String>(); 

for(int i=0; i<teams.length(); i++){     
    JSONObject e = teams.getJSONObject(i); 
    //get TeamID 
    map.put(e.getString("team_id"), 0); 
    //Goals + 
    map.put(e.getString("team_id")+"G+", 0); 
    //Goals - 
    map.put(e.getString("team_id")+"G-", 0); 
    //standings.add(map); 
    //Log.e("Team7", String.valueOf(map.get("7"))); 
    //Log.e("Team7", e.getString("team_id")); 
} 

for(int i=0; i<matchdata.length(); i++){ 
    JSONObject e = matchdata.getJSONObject(i); 
    //calculate Points 
    int myVarGoal1 = Integer.valueOf(e.getString("points_team1")); 
    int myVarGoal2 = Integer.valueOf(e.getString("points_team2")); 
    if ((myVarGoal1) > (myVarGoal2)){ 
     myPoint1 = 3; 
     myPoint2 = 0; 
    } 
    if ((myVarGoal1) < (myVarGoal2)){ 
     myPoint1 = 0; 
     myPoint2 = 3; 
    } 
    if ((myVarGoal1) == (myVarGoal2)){ 
     myPoint1 = 1; 
     myPoint2 = 1; 
    } 
    int calc1 = (map.get(e.getString("id_team1")) + myPoint1); 
    int calc2 = (map.get(e.getString("id_team2")) + myPoint2); 
    map.put("id", Integer.valueOf(i)); 
    map.put(e.getString("id_team1"), calc1); 
    map.put(e.getString("id_team2"), calc2); 

    //calculate Goals 
    int calcGoal1 = (map.get(e.getString("id_team1")+"G+") + myVarGoal1); 
    int calcGoal2 = (map.get(e.getString("id_team1")+"G-") + myVarGoal2); 
    int calcGoal3 = (map.get(e.getString("id_team2")+"G+") + myVarGoal2); 
    int calcGoal4 = (map.get(e.getString("id_team2")+"G-") + myVarGoal1); 
    map.put(e.getString("id_team1")+"G+", calcGoal1); 
    map.put(e.getString("id_team1")+"G-", calcGoal2); 
    map.put(e.getString("id_team2")+"G+", calcGoal3); 
    map.put(e.getString("id_team2")+"G-", calcGoal4); 
    //standings.add(map); 
    //Log.e("TeamID", e.getString("id_team1")); 
    //Log.e("PointsTeam7", String.valueOf(map.get("7"))); 
    //Log.e("GaolsTeam7", String.valueOf(map.get("7G-"))); 
} 

for(int i=0; i<teams.length(); i++){     
    JSONObject e = teams.getJSONObject(i); 
    String myTeamID = e.getString("team_id"); 
    int Gdif = (map.get(myTeamID+"G+")) - (map.get(myTeamID+"G-")); 
    tab.put(myTeamID, e.getString("team_name") +","+ map.get(myTeamID) +","+ (map.get(myTeamID+"G+")) +":"+ (map.get(myTeamID+"G-")) +" "+ Gdif); 
    //Log.e("Team7", String.valueOf(tab.get("7"))); 
    //Log.e("Team7", e.getString("team_id")); 
    strGoals+="\n" + String.valueOf(tab.get(myTeamID)); 
} 
+3

你有没有试过比较器? http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html –

+0

比较器对3个独立的值进行排序?我需要将所有相关数据收集到一个对象中并进行排序?!或者我误解了它? – sarahsdev

+0

“G +”,“G-”和“P”代表什么? –

回答

0

我想你要寻找的是一个TreeMapComparator。你可以改用TreeMap吗?它的工作原理与HashMap一样,但会自动为您分配密钥。然后你可以使用一个Comparator这样的:

Map<String, Integer> map = new HashMap<String, Integer>(); 

    ..... do stuff ..... 

TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(new Comparator<String>() 
{ 
    @Override 
    public int compare(String lhs, String rhs) 
    { 
     // return 1 if lhs > rhs 
     // return 0 if lhs = rhs 
     // return -1 if lhs < rhs 
     if (lhs == null && rhs == null) return 0; 
     if (lhs == null) return -1; 
     if (rhs == null) return 1; 

     if ((lhs.endsWith("P") && (rhs.endsWith("P"))) 
      || (lhs.endsWith("G+") && (rhs.endsWith("G+"))) 
      || (lhs.endsWith("G-") && (rhs.endsWith("G-")))) 
     { 
      return lhs.compareTo(rhs); 
     } 
     else if (lhs.endsWith("P")) 
     { 
      return -1; 
     } 
     else if (rhs.endsWith("P")) 
     { 
      return 1; 
     } 
     else 
     { 
      String lastLeftChar = lhs.substring(lhs.length()-1); 
      String lastRightChar = rhs.substring(rhs.length()-1); 

      return lastLeftChar.compareTo(lastRightChar); 
     } 
    } 
}); 
treeMap.putAll(map); 

// Now your treeMap is sorted by the keys! 
+0

按键排序,而不是按价值 – sarahsdev

0

这听起来像你需要先创建自己的类来保存相关数据作为一个单独的对象。班级的确切名称取决于数据是什么。也许SoccerTeamSoccerSchedule。创建此类后,可以实现接口Comparable或创建一个Comparator对象,该对象定义排序顺序。

+0

你能举个例子我怎么能做到这一点?我尝试像这样:map.put(e.getString(“team_id”),new TeamEntry(0,0,0));有三个值是我的G +,G-和P.但它不起作用。 – sarahsdev