1

いくつかのデータを並べ替えたい。現時点では、データはマップに保存されています。マップ内のデータを値でソートすることはできません。サッカーのスケジュールを次のように計算します。

チーム名、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を行うには、値を a に取得する方が良いと思います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));
}
4

2 に答える 2

0

あなたが探しているのは aTreeMapと aだと思いますComparatorTreeMap代わりにa を使用するように切り替えることはできますか? と同じように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!
于 2013-09-23T18:54:53.493 に答える
0

関連データを 1 つのオブジェクトとして保持するには、まず独自のクラスを作成する必要があるようです。クラスの正確な名前は、データが何であるかによって異なります。多分SoccerTeamまたはSoccerSchedule。このクラスを作成したら、Comparableインターフェイスを実装するかComparator、並べ替え順序を定義するオブジェクトを作成できます。

于 2013-09-23T19:00:15.187 に答える