【发布时间】: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
linkMap = new HashMap();
标签: java