0

这个问题比标题所说的要复杂一些。

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

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

我目前正在做我需要的几乎所有事情,但是,Object 的数量比 Item 的多,所以我使用 null 类型来表示空橱柜。但是,当我运行我的代码时,地图正在被修改(可能是在 for 循环中),反过来,元素被错误地覆盖,一段时间后可能会给我留下一个充满空值的列表(和空橱柜)

我目前所拥有的...

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

?

4

2 回答 2

0

如果您想坚持自己的方法,Ragavan 有一个很好的答案。但是,您正在做很多工作来旋转项目。仅旋转索引(使用模数)并保持数组相同会更有效:

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));
}
于 2013-08-25T05:53:23.723 回答
0

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

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

于 2013-08-25T04:40:57.273 回答