这个问题比标题更复杂。
我要做的是为游戏存储{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
答案 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));
}