【问题标题】:Search for field in a List of Objects in Java [duplicate]在 Java 中的对象列表中搜索字段 [重复]
【发布时间】:2016-08-10 12:37:39
【问题描述】:

在我正在设计的应用程序中,我有一个名为Shop 的自定义对象列表。 Shop 类可以在这里看到。

Shop.java

public class Shop extends Object {

    private String title = "";
    private List<HashMap<String, String>> branchDetails = new ArrayList<>();
    private String description = "";
    private String imageLink = "";
    private String webLink = "";

    public Shop() {

    }
}

在我的应用程序中,我创建了一个 List&lt;Shop&gt; 对象并用 1500 个 Shop 对象填充它。

现在我想在列表中搜索并找到带有与字符串匹配的“Weblink”的商店的索引。即我想以与数据库相同的方式查询列表。有没有一种方法可以做到这一点而无需构建和填充数据库?

我已经覆盖了 Shop.java 中的 equals 和 hashcode 方法,并且可以使用 List#contains 方法来验证列表是否包含具有匹配网络链接的对象,但无法获取该对象的索引。

equals 和 hashcode 方法:

public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Shop shop = (Shop) o;

    return getWebLink().equals(shop.getWebLink());

}

@Override
public int hashCode() {
    return getWebLink().hashCode();
}

为了使用它,我创建了一个带有 webLink 的新商店,我想查询

Shop shop = new Shop();
shop.setWebLink("http://somelink.com");

shopsList.contains(shop) //returns true if weblink string matches one from list of shops

【问题讨论】:

  • 虽然允许像问题所暗示的那样进行等号检查可以工作,但当您希望按标题或描述“搜索”时会发生什么?如图所示覆盖 .equals 可能会受到限制。
  • 是的,我同意它是有限制的,而且可能不是很可扩展,但就我目前的需要而言,我只需要匹配网络链接。它是一种唯一标识符的链接。
  • 注意,在这种情况下,您需要indexOf 而不是contains,但想法完全相同。
  • 也许你应该只使用这样的地图: Map linkMap = new HashMap();

标签: java


【解决方案1】:

检查 Collections API 的方法 indexOf,它就是你要找的。​​p>

【讨论】:

  • 据我所知, indexOf 需要整个对象来匹配。所以在这种情况下它会返回-1。还是我弄错了? indexOf在确定索引时是否调用了覆盖的equals方法?
  • 是的,它使用了重写的 equals 方法,请参阅docs.oracle.com/javase/7/docs/api/java/util/…
  • 圣牛就是这样。我已经测试了 indexOf 方法,但这一定是在我创建新的 equals 方法之前。谢谢先生,效果很好。
【解决方案2】:

使用indexOf()获取元素索引。

返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。

请注意,如果您有多个有意义的相等商店,它会返回第一个匹配索引。

【讨论】:

  • 据我所知, indexOf 需要整个对象来匹配。所以在这种情况下它会返回-1。还是我弄错了? indexOf在确定索引时是否调用了覆盖的equals方法?
  • 你可以根据你的字符串webLink创建一个Shop实例,并检查List中的实例与否,对吧?
猜你喜欢
  • 2011-07-08
  • 2016-01-07
  • 2011-02-01
  • 1970-01-01
  • 2015-10-14
  • 2012-10-19
  • 2021-08-26
  • 2020-11-19
相关资源
最近更新 更多