【问题标题】:Double nested for loop iteration (ArrayList)双重嵌套for循环迭代(ArrayList)
【发布时间】:2013-10-20 18:54:47
【问题描述】:

我有一个涉及加载“PlayerValue”对象的系统。对象的格式如下:[Header] 值。我将这些保存在文本文件中,每当我保存或读取文件时,我都想删除重复的标题。所以我这样做了:

首先,我将文件中的所有 PlayerValues 加载到一个名为“array”的 ArrayList 中,然后:

for (PlayerValue v : array) {
            for (PlayerValue v1 : array) {
                if (v1.header.equals(v.header)) {
                    array.remove(v1);
                }
            }
        }

在这里你可以看到,它遍历数组的每一项,然后对于每一项,它再次在数组中搜索相同的标题。

这将有效地删除重复的标头,除了它会引发 ConcurrentModificationException。

对变通有什么帮助吗?

【问题讨论】:

  • 使用 HashSet 等 Set 而不是 ArrayList。集合不允许重复。否则要在迭代时从集合中删除,请使用迭代器。
  • 我可以处理重复的条目,但是两个 PlayerValues 可能具有相同的标头但值不同(从而使它们不相等)并且 ArrayList.contains 方法会忽略它。
  • @HovercraftFullOfEels 唯一的问题是他想根据某些属性删除重复项,而不仅仅是基于对象是否相等。

标签: java arraylist iteration


【解决方案1】:

即使这样有效,删除重复项也是一种糟糕的方法。更好的选择是Map<Header, PlayerValue>:

Map<String, PlayerValue> map = new HashMap<>();

for (PlayerValue v : array)
    map.put(v.header, v);

现在您可以遍历此映射的条目,其中不会包含重复的键(标题):

array.clear();

for (Entry<?, PlayerValue> e : map.entrySet())
    array.add(e.getValue());

【讨论】:

  • Header 不是一个单独的对象,它是 PlayerValue 的一个属性。
  • @LegendOfFailure 这是什么,String
  • 是的。所以你不能在 Map 的 Object 输入中使用 'Header'
  • 这就是我正在做的,我完全忘记了HashMap。
  • 如果我想更进一步,我可以编辑方法的其余部分以仅使用地图,而不是 ArrayList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多