更新/插入和重新组织列表

时间:2017-01-21 21:32:05

标签: java data-structures

概述:所以目前我有一个Map<List<Pair<Integer, Integer>>用于游戏,其中键和值系统如下所示:

mapid: List<characterid, donation_amount>

为了解释,每个地图都有一个id,玩家可以将X金额的游戏币捐赠给该地图,成为地图的捐赠之王。该地图记录了他们的ID以及他们在过去一个月内捐赠的总额。

问题:目前,我正在决定实施包含每张地图最高捐赠者的降序有序列表的最佳方法。这就是我的想法。

Map Id       Character Id       Amount
100000            3             100000
110000            4             200000
100000            5              10000
110000            6             100000
200000            7                  0

我在游戏保存或关闭时将数据存储在SQL表中,然后由以下函数检索。

public void loadDonations() {
    try (PreparedStatement ps = DatabaseConnection.getConnection().prepareStatement("SELECT * FROM medal_rankings ORDER BY donated DESC");
         ResultSet rs = ps.executeQuery()) {

        while (rs.next()) {
            int mapid       = rs.getInt("mapid");
            int characterid = rs.getInt("characterid");
            int donated     = rs.getInt("donated");

            if (!donations.containsKey(mapid))
                donations.put(mapid, new ArrayList<Pair<Integer, Integer>>());
            donations.get(mapid).add(new Pair<Integer, Integer>(characterid, donated));
        }
    } catch (Exception e) {
        e.printStackTrace();
        LogHelper.INVOCABLE.get().info("DonorKing: failed to load donations"); 
    }
}

当玩家捐款时,整个数据结构会以这种方式更新和重组。

public void addDonation(int amount, int mapid, int characterid) {
    List<Pair<Integer, Integer>> map_donations = donations.get(mapid);
    if (!donations.containsKey(mapid))
        donations.put(mapid, new ArrayList<Pair<Integer, Integer>>());
    if (!map_donations.contains(characterid))
        map_donations.add(new Pair<Integer, Integer>(characterid, amount));
    else {
        for (int x = 0; x < map_donations.size(); x++) {
            List<Pair<Integer, Integer>> donation = map_donations;
            if (donation.get(x).left == characterid) {
                amount += donation.get(x).right;
                donation.remove(donation.get(x));
                break;
            }
        }

        for (int x = 0; x < map_donations.size(); x++)
            if (map_donations.get(x).right <= amount) {
                map_donations.add(new Pair<Integer, Integer>(characterid, amount));
                break;
            }
    }
}

Afterthoughts :我不喜欢的是,最糟糕的时间复杂度可能是O(N ^ 2)。对此的理由是我可以迭代到列表的末尾以找到我的元素,将其删除,然后再次遍历列表,直到找到要插入的区域。

是否有更好的方法来改进现有代码,甚至更好地采用新系统来解决这个特定问题?

0 个答案:

没有答案