如何在ArrayList中设置特定项,而不会出现OutOfBounds错误?

时间:2017-07-26 07:49:09

标签: java plugins

我正在尝试为游戏编写Trade插件代码。我的想法是玩家向另一个玩家发送请求,如果另一个玩家接受,那么每一方都必须选择要交易的项目。

我有4个ArrayLists: 存储请求者,存储所请求的,存储请求者所选择的项目并存储所请求的所选项目。问题在于,如果多个玩家同时进行交易,我只能将该项目添加到列表中,因为它可以与其他人的交易相匹配。我试着这样做:

requesterItems.set(requesterIndex, clicked);

其中requesterIndex是另一个列表中请求者的索引,单击是选择的项目。

我知道为什么会出现错误,但我无法想到解决方法。问题是List是空的,并且此索引中没有元素。如何在不触及列表中的其他位置的情况下在其中添加元素?

1 个答案:

答案 0 :(得分:2)

如果可能的话,我会避免使用具体的索引,而是使用对象。

正如评论中已经提到的,我会推荐一个带有HashMap的自己的类。下面是一些代码,就像我会做的那样(!未经测试!):

private HashMap<YourPlayerClass, List<YourItemClass>> playerItemMap = new HashMap<>();

private void tradeItems(YourPlayerClass p_player1, YourPlayerClass p_player2,
                        YourItemClass p_itemOfPlayer1, YourItemClass p_itemOfPlayer2)
{
     List<YourItemClass> itemsOfPlayer1 = playerItemMap.get(p_player1);
     List<YourItemClass> itemsOfPlayer2 = playerItemMap.get(p_player2);

     //Carry out the trade for player 1
     itemsOfPlayer1.remove(p_itemOfPlayer1);
     itemsOfPlayer1.add(p_itemOfPlayer2);
     playerItemMap.put(p_player1, itemsOfPlayer1); //Not sure if this put is necessary

     //Carry out the trade for player 2
     itemsOfPlayer2.remove(p_itemOfPlayer2);
     itemsOfPlayer2.add(p_itemOfPlayer1);
     playerItemMap.put(p_player2, itemsOfPlayer2); //Not sure if this put is necessary
}

所以这是一个HashMap,其中玩家为关键,而他/她的项目为List-value。

代码示例不是故障安全的。我建议添加一些检查项目是否真的在此列表中,以避免错误。像:

if(itemsOfPlayer1.contains(p_itemOfPlayer1))
{
    //Carry out the trade
}
else
    System.err.println("Player 1 tried to trade an item which wasn't in his/her inventory! Shouldn't be possible!");

我希望这有助于解决您的问题,如果我错了,请告诉我!祝你好运!