如何比较列表和字符串数组(Java)?

时间:2012-08-18 19:18:11

标签: java android arrays string list

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

例如:

列表包含: b C 一个 ë

数组包含: 一个 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);
        }
    }

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

2 个答案:

答案 0 :(得分:11)

您要找的是Collection.retainAll

  

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

list.retainAll(Arrays.asList(array));

答案 1 :(得分:1)

一个重要的一点会让你的生活变得困难,你的方法会产生不良后果。删除播放器将改变列表中的元素,以便最终跳过播放器。

例如,在列表中:

{A,B,C}

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

{A,C}

当x递增时,你最终得到x = 3,这曾经指向C.但现在它指向的是什么。

相反,请考虑使用迭代器。看到: Iterator in Java

这将允许您删除元素而不会破坏索引。

所以为了回答你的问题,我会在activePlayers上创建一个迭代器。在迭代时,只需根据列表检查迭代器中的每个项目,如果找不到则删除项目。