在 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<Shop>
对象并用 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检查 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 中的对象列表中搜索字段 [重复]的主要内容,如果未能解决你的问题,请参考以下文章