【问题标题】:is their are any alternative methods instead of iterator for my requirement他们是我的要求的任何替代方法而不是迭代器
【发布时间】:2021-05-13 02:04:16
【问题描述】:

我有一张地图HashMap<sId, List<Bannas>>,其中sId 与列表中的许多 Id 相似,而且我还有一种方法 getListbySId(在 sId 中)。 通过使用这种方法,我可以获得基于 sId 的具有相似值的值列表。 现在我必须从基于 sId 的值列表中删除一个值,然后可以通过迭代过程来比较值列表的 id。如果匹配,我将删除它。除了这种方法,任何人都可以说另一种方法来删除值或获取值而不改变要求。我无法提供代码请帮助我。

【问题讨论】:

  • 我猜map.keySet().removeIf( id -> id.equals( otherSId ) ); 是你需要的……
  • 你能在remove if condition中解释更多吗
  • @Kaplan map.keySet().removeIf( id -> id.equals( otherSId ) );map.remove( otherSId ); 完全相同,只是由于线性迭代效率较低。
  • @Kaplan 根据地图的大小,即使是三个删除操作也会比在整个地图上运行removeIf 更有效。对于更多键,您甚至可以使用map.keySet().removeAll(Set.of(sID1,sID2, sID3…));,它将自动选择更适合地图当前大小和参数集大小的策略。除此之外,还不清楚 OP 中的句子中的“相似”是什么意思,例如“其中 sId 对于列表中的许多 Id 是相似的”。
  • @Kaplan 嗯? keySet().removeAll(Set.of(…)) 迭代器的替代品。我不知道 OP 的“相似”实际上是什么意思。 OP 的句子“其中 sId 对于列表的许多 Id 是相似的”而是表明它实际上意味着“相等”,因为一个 list 的所有元素都映射到映射的相同键。只要我们不知道 OP 真正想要什么,就没有必要提供不必要使用 removeIf 的示例。

标签: java list collections hashmap iterator


【解决方案1】:

如果要从List<Bannas> 中删除一些匹配Bannas 对象的id 字段的一些值(可能是sId 或其他id),可以使用Collection::removeIf 方法:

 //

public static void removeValuesById(HashMap<String, List<Bannas>> map, String sId, String anotherId) {
    map.getOrDefault(sId, Collections.emptyList())
       .removeIf(banna -> banna.getId().equals(anotherId));
}

更新
另一个解决方案不依赖于Collections.emptyList的实现应该处理sId不在地图中的情况:

public static void removeValuesById(HashMap<String, List<Bannas>> map, String sId, String anotherId) {
    Optional.ofNullable(map.get(sId))
            .ifPresent(list -> 
                list.removeIf(banna -> banna.getId().equals(anotherId))
    );      
}

【讨论】:

  • 许多不可变集合被设计为在调用突变方法时无条件抛出,无论它们是否会导致修改。 Collections.emptyList().removeIf(…); 可能是规则的例外,但我会避免创建依赖它的代码。
  • @Holger,Collections.emptyList返回的列表不抛出异常,removeIfCollections::EmptyList覆盖to return false, line 4525
  • 我知道,但这有任何规范保证吗? The general contract 关于 UnsupportedOperationException 是“如果无法删除匹配的元素或通常不支持删除,实现可能会抛出此异常。
  • 对于List.of()Collections.unmodifiableList(Collections.emptyList()),也没有要遍历的元素,但这些集合仍然无条件抛出,因为规范允许。那么,您在哪里看到Collections.emptyList().removeIf(…) 永远不会像List.of().removeIf(…) 那样抛出的保证
  • 我知道,它似乎不是严格不可变的。 OpenJDK 以这种方式实现了它。您的代码适用于参考实现的当前版本。我从来没有说过别的。问题是创建代码依赖这种未指定的行为是否是一个好主意。正如我在第一条评论中所说,我会避免它。
猜你喜欢
  • 2017-03-12
  • 2011-05-05
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
相关资源
最近更新 更多