【问题标题】:How to compare a list and string array (Java)?如何比较列表和字符串数组(Java)?
【发布时间】:2012-08-14 19:58:23
【问题描述】:

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

例如:

列表包含: b C 一种 e

数组包含: 一种 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,这很好。它需要反过来。

【问题讨论】:

    标签: java android arrays string list


    【解决方案1】:

    你要找的是Collection.retainAll

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

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

    【讨论】:

      【解决方案2】:

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

      例如,在列表中:

      { A、B、C }

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

      { A, C }

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

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

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

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

      【讨论】:

      • 将数组元素添加到更适合containsSet 可能是一个更好的主意。
      • 欢迎来到 StackOverflow,Jay。
      • 谢谢,owlstead。多年来我一直在享受这些好处,认为是时候回馈社会了。
      猜你喜欢
      • 2012-02-14
      • 2020-08-07
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多