在 Java 中的对象列表中搜索字段 [重复]

Posted

技术标签:

【中文标题】在 Java 中的对象列表中搜索字段 [重复]【英文标题】:Search for field in a List of Objects in Java [duplicate] 【发布时间】: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(); 【参考方案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中的实例与否,对吧?

以上是关于在 Java 中的对象列表中搜索字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中的对象列表中查找重复项

检索数组列表中的最后一个对象? Java [重复]

LINQ 查询以检测对象列表中的重复属性

具有重复键的对象列表将字段组合到逗号列表中

Java 8如何操作一个列表中的对象并将其收集到另一个列表中? [重复]

通过mongo中的填充字段查询[重复]