【问题标题】:Check if custom List contains an Item检查自定义列表是否包含项目
【发布时间】:2018-01-18 09:41:27
【问题描述】:

我有一个自定义列表,想检查它是否包含特殊项目。 TheList 填充有Rowlayout 对象。

public RowLayout(String content, int number) {
        this.content = content;
        this.number = number;
    }

现在我想检查我的List<Roalayout> 是否在content - 位置包含一个特殊项目。我该怎么做?

只问.contains'是行不通的。

我要检查的内容:

if (!List<RowLayout>.contains("insert here"){
//Do something
}

【问题讨论】:

  • hashCodeequals 施展魔法;)
  • @SomeJavaGuy 除非你不能更改类代码...
  • 你有 java-8 吗?
  • @Eugene 在这种情况下使用Map 可能是比使用List 更好的决定

标签: java


【解决方案1】:

如果您可以编辑类 RowLayout,只需使用您想要的任何相等性覆盖 hashCodeequals

例如,如果您不能并且拥有 java-8,则可以这样做:

String content = ...
int number = ...

boolean isContained = yourList.stream()
        .filter(x -> x.getContent().equals(content))   
        .filter(x -> x.getNumber() == number)
        .findAny()
        .isPresent();

您显然可以从 OptionalfindAny 返回您感兴趣的实例。

【讨论】:

  • 抱歉,我是个初学者。 “只覆盖hashCodeequals”是什么意思?
  • @Sarius google.com/…
【解决方案2】:

您只需要覆盖equals 以使List.contains 相应地工作。 List.contains 在文档中说:

当且仅当此列表包含至少一个元素 e 时返回 true 这样
(o==null ? e==null : o.equals(e)).

equals 的实现可能如下所示:

class RowLayout {
    private String content;
    private int number;

    public boolean equals(Object o)
    {
        if (!(o instanceof RowLayout)) return false;
        final RowLayout that = (RowLayout) o;
        return this.content.equals(that.content) && this.number == that.number;
    }
}

不要忘记also override hashCode,否则您的课程将无法在HashSets 或HashMaps 等基于哈希的结构中工作。

示例用法:

myList.contains(new RowLayout("Hello", 99));

如果您只关心内容而不关心数量,另一种 Java 8 解决方案是这样做:

boolean isContained = myList.stream() 
                            .map(RowLayout::getContent)
                            .anyMatch("some content");

【讨论】:

  • 当我只想检查它是否在第一个位置包含一个项目时? F.e. myList.contains(new RowLayout("Hello"));
  • 谢谢你这么诚实!
  • @Sarius 没问题。我添加了另一个 Java 8 解决方案,如果您只关心一个字段,它会更短。
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2014-03-02
相关资源
最近更新 更多