【问题标题】:How to delete elements from a List synchronously by Index?如何通过索引从列表中同步删除元素?
【发布时间】:2014-07-31 10:55:11
【问题描述】:

我有一个List 的卡片,Card 是一个类。我有三手牌,每手牌发四张牌。

在游戏里面onTouchEventMotionEvent.ACTION_UP里面的时候我要删除触摸卡,问题是:

如果一手牌的可用卡片ID如下:100,130,112,70,相应的indeces:0,1,2,3。当我想删除触摸的卡片时,索引会重新洗牌,例如,

(100,130,112,70)->(0,1,2,3) delete(1)==>130 will be deleted

(100,112,70)->(0,1,2) delete (2) ==> 70 will be deleted and NOT 112.

(100,112)->(0,1) delete (3) ==> an OUT_OF_BOUND exception will be thrown.

如何避免这种情况,我尝试通过参考列表中每个元素的比例来删除元素,但它很复杂。

【问题讨论】:

  • 您应该按 id 删除卡。
  • @Luksprog 是的,但我也需要参考每个卡片索引
  • 您应该使用 ArrayList 之类的 dataStructure 或类似的东西,它没有索引值关系。因为你的 cardID 本身就是独一无二的。因此,正如@Luksprog 所评论的那样,它将帮助您通过 ID 直接删除卡。我猜您目前正在使用数组作为数据结构。
  • 你可以使用带有 int-key 的 HashMap 而不是 List

标签: java android list arraylist


【解决方案1】:

请参阅 SparseArray(其中有很多)...如果我说对了,那正是您所需要的。 它基本上是一种哈希映射,但开销较小。

【讨论】:

    【解决方案2】:

    使用您当前的实现,您可以简单地从列表中从最高索引开始删除,然后移至最低:

    (100,130,112,70)->(0,1,2,3) delete(3)==>70 will be deleted.
    (100,130,112)->(0,1,2) delete (2) ==> 112 will be deleted.
    (100,130)->(0,1) delete (1) ==> 130 will be deleted.
    

    但是,您最好将卡存储在 Map 或 ID 到 Cards 中。这样您就可以简单地按 ID 删除,而不必担心它的索引。

    【讨论】:

      【解决方案3】:

      您可以将卡片内部存储在 Map 中 - 这样,键(索引)将保持不变。

      但是,选择要删除的卡片索引的逻辑是可疑的 - 当只有两张卡片时,您的代码为什么要删除索引 3,为什么要在索引 1 上删除卡片时选择索引 2?

      【讨论】:

      • 每手牌0-3四张牌,当用户选择一张牌出牌时,应删除这张牌
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2010-10-12
      • 2023-02-23
      • 2016-12-03
      相关资源
      最近更新 更多