2013-09-23 5 views
1

Я хочу отсортировать данные. На данный момент данные хранятся на карте. Я знаю, я не могу сортировать данные на карте по значению. Я рассчитать график футбол так:Android: HashMap сортировать по 3 значениям

TeamName, G +, G-, P

Я хочу, чтобы отсортировать сначала Р, затем G +, затем G-.

Каждый к, 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

Я думаю, что вы ищете является TreeMap и Comparator. Можете ли вы переключиться на использование 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

Похоже, вы должны сначала создать свой собственный класс для хранения данных, связанных как единый объект. Точное имя класса зависит от данных. Возможно SoccerTeam или SoccerSchedule. После создания этого класса вы можете реализовать интерфейс Comparable или создать объект Comparator, который определяет порядок сортировки.

+0

Можете ли вы привести пример, как я могу это сделать? Я попробую что-то вроде этого: map.put (e.getString («team_id»), новый TeamEntry (0, 0, 0)); с 3 значениями являются мои G +, G- и P. Но это не сработает. – sarahsdev

Смежные вопросы