如何按先前值更新Java hashmap值

时间:2013-08-25 04:26:35

标签: java map hashmap

这个问题比标题更复杂。

我要做的是为游戏存储{Object:Item}的地图,其中Object代表橱柜,而Item代表橱柜的内容(即里面的项目)。

基本上我需要做的是以顺时针(正)旋转更新项目的值;虽然我不想在创建列表后以任何方式修改列表,但只移动值+ 1的位置。

我目前正在做几乎所有我需要的东西,但是,有更多的对象而不是Item的所以我使用null类型来表示空橱柜。但是,当我运行我的代码时,地图正在被修改(可能是因为它在for循环中),反过来,元素被错误地覆盖,在A while之后可能会留下一个满是空的列表(和空橱柜)< / p>

到目前为止我所拥有的......

private static Map<Integer, Integer> cupboardItems = new HashMap<Integer, Integer>();

private static Map<Integer, Integer> rewardPrices = new HashMap<Integer, Integer>();

private static final int[] objects = { 10783, 10785, 10787, 10789, 10791, 10793, 10795, 10797 };

private static final int[] rewards = { 6893, 6894, 6895, 6896, 6897 };

static {
    int reward = rewards[0];
    for (int i = 0; i < objects.length; i++) {
        if (reward > rewards[rewards.length - 1])
            cupboardItems.put(objects[i], null);
        else
            cupboardItems.put(objects[i], reward);

        reward++;
    }
}

// updates the items in the cupboards in clockwise rotation.
            for (int i = 0; i < cupboardItems.size(); i++) {
                if (objects[i] == objects[objects.length - 2])
                    cupboardItems.put(objects[i], cupboardItems.get(objects[0]));
                else if (objects[i] == objects[objects.length - 1])
                    cupboardItems.put(objects[i], cupboardItems.get(objects[1]));
                else
                    cupboardItems.put(objects[i], cupboardItems.get(objects[i + 2]));
            }

那么我如何修改我的代码进行更新,以便得到以下结果..

======
k1:v1
k2:v2
k3:v3
k4:none
=======
k1:none
k2:v1
k3:v2
k4:v3

2 个答案:

答案 0 :(得分:0)

HashMap不保证排序,因此如果您需要排序,请使用ArrayList或LinkedList。

如果您想坚持使用HashMap,则需要在每次轮换之前根据键对HashMap进行排序。您可以轻松排序,因为键是Integer对象。但这会影响性能。

答案 1 :(得分:0)

如果你想坚持自己的方法,拉格万有一个很好的答案。但是,您只需旋转项目即可完成大量工作。仅旋转索引(使用模数)并保持数组相同会更有效:

final static List<Integer> objects = new ArrayList<Integer>(
    Arrays.asList(10783, 10785, 10787, 10789, 10791, 10793, 10795, 10797));

final static List<Integer> rewards = new ArrayList<Integer>(
    Arrays.asList(6893, 6894, 6895, 6896, 6897, -1, -1, -1));

public static int getReward(int obj, int rot){
    int rotIndex = (objects.indexOf(obj) - rot)%objects.size();

    //modulus in java can be negative
    rotIndex = rotIndex < 0 ? rotIndex+objects.size():rotIndex;

    return rewards.get(rotIndex);
}

public static void main(String... args){
    //This should give 6897, which is the reward for obj 10783 after 4 rotations
    System.out.println(getReward(10783,4));
}