1

我正在为 Android 编写一个应用程序。我使用字符串数组从共享首选项中提取所有玩家名称(必须是字符串数组)。我有一个列表可以从共享偏好中提取所有活跃玩家(必须是一个列表)。我需要检查我的列表以查看它是否包含任何不在我的播放器数组中的播放器并删除它们。我似乎无法弄清楚其中的逻辑。

例如:

列表包含: b c a e

数组包含: a b c d

由于 'e' 存在于 List 但不存在于 Array 中,因此需要从列表中删除 'e'。我知道命令(.contains()、.remove()、for()),但我无法弄清楚逻辑。

我的第一次尝试是:

for(int x=0;x<numOfPlayers;x++){
        players[x] = getPrefs.getString("player"+Integer.toString(x), " ");
        if(activePlayers.size()>0)
            if(activePlayers.contains(players[x]))
                playersChecked[x] = true;
        else{
            if(x<activePlayers.size())
                activePlayers.remove(x);
        }
    }

但是如果 player[x] 有一个 activePlayers 没有的项目,这会从 activePlayers 中删除 x,这很好。它需要反过来。

4

2 回答 2

11

您正在寻找的是Collection.retainAll.

仅保留此集合中包含在指定集合中的元素

list.retainAll(Arrays.asList(array));
于 2012-08-18T19:22:26.963 回答
1

重要的一点会让你的生活变得困难,你的方法会产生不必要的后果。移除一个玩家会改变列表中的元素,所以你最终会跳过玩家。

例如,在列表中:

{甲,乙,丙}

如果你删除 B,你最终会得到:

{ A, C }

当 x 增加时,你最终会得到 x = 3,它曾经指向 C。但现在它什么都不指向。

相反,请考虑使用迭代器。请参阅: Java 中的迭代器

这将允许您在不破坏索引的情况下删除元素。

因此,为了回答您的问题,我将在 activePlayers 上创建一个迭代器。迭代时,只需对照列表检查迭代器中的每个项目,如果未找到则删除该项目。

于 2012-08-18T19:30:30.460 回答