当前位置: 首页 > 知识库问答 >
问题:

在列表中查找对象而无需迭代它

劳彦
2023-03-14

我有一个具有3个属性的类:

private static class OrderListItem {
    public int price;
    public int size;
    public Type type;
}

此类的项目将添加到列表中<代码>列表

我想在列表中找到一个指定价格的对象。但大小和类型并不重要。我可以这样做吗:

int index=orders\u book。indexOf(新订单列表项(价格,**任意尺寸**,**任意类型**))

或者我必须进行“循环”搜索?


共有1个答案

麹鸿煊
2023-03-14

如果需要检索具有所需价格的实例,则可以使用带有过滤器findAny操作的收集流。

int myPrice = /* any value you want */

//This will retrieve an instance with the disired price or null if none is found
OrderListItem item = orders_book.stream()
        .filter(i -> i.getPrice() == myPrice)
        .findFirst()
        .orElse(null);

或者,如果要检索具有所需价格的对象索引,则有两个选项:

  1. 重新定义OrderListItem类的equals方法,以按价格相等于两个OrderListItem,因为indexOf方法的文档通过其equals方法检索一个元素。然而,我不会倾向于这个解决方案,因为在我看来,唯一的价格不足以等于两个订单项目,但你肯定比我更清楚你正在建模的问题。所以,我把选择权留给你。此外,如果您重新定义了equals方法,那么您还应该重新定义hashCode方法,正如通用hashCode契约所述

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#indexOf-java.lang.Object-

返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。更正式地说,返回最低的索引i,这样(o==null?get(i)==null:o.equals(get(i)),如果没有这样的索引,则返回-1。

class OrderListItem {
    public int price;
    public int size;
    public Type type;

    /* ... your implementation ...*/

    @Override
    public int hashCode() {
        return Objects.hash(price);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (this == obj) return true;
        if (getClass() != obj.getClass()) return false;
        OrderListItem other = (OrderListItem) obj;
        return Objects.equals(price, other.price);
    }
}
int myPrice = /* any value you want */

//This will retrieve an instance with the disired price or null if none is found
OrderListItem item = orders_book.stream()
        .filter(i -> i.getPrice() == myPrice)
        .findFirst()
        .orElse(null);

//Retrieving the index
int index = orders_book.indexOf(item);
 类似资料:
  • 我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。

  • 问题内容: 我有一张桌子,上面有一块田地。这是我执行时发生的情况: 我想要一个给我以下结果的SQL: 我该如何编写SQL来执行此类查询?我正在使用PostgreSQL。 问题答案: 使用现代SQL,可以使用窗口函数轻松完成此操作: SQLFiddle:http ://sqlfiddle.com/#!15/1e807/1

  • 我有一个person对象,想知道是否可以使用JSTL来执行以下操作: 到目前为止,我所发现的一切都指向集合或数组列表。用户作为会话变量存储。 这可能吗? 非常感谢。

  • 我目前正在努力迭代从第三方API获取的JSON对象。您可能会看到,以前没有真正处理过获取API。 这是我正在获取的JSON文件: 链接到JSON文件 为了获取数据,我使用一个useFetch脚本,它看起来像这样: 我稍后尝试导出的只是每个角色/冠军的名称(他本身就是一个对象,包括名称、描述等) 不幸的是,我在尝试转换JSON对象表示:

  • 我有一个清单,必须找到具体的对象。我必须按学生平均价值排序列表,并创建函数来搜索具有第二高价值的学生。如果与其他学生重复,则按函数返回较小的学生。这个任务的另一个要求(要妥善解决)是我不能创建任何对象。下面我留下了我正在使用的类的代码: 现在,我尝试通过对stream进行反向排序来解决这个问题,然后移除stream的第一个值,并比较stream的两个下一个对象并返回正确的一个。我可以使用for循环

  • 问题内容: 我有简单的redis列表键=>“ supplier_id” 现在,我只需要它检索列表的所有值,而无需实际遍历列表或从列表中弹出该值 从列表中检索所有值的示例现在,我遍历了redis的长度 在 没有迭代的情况下 可以通过更好的redis建模来完成这件事吗?谁能建议 问题答案: 要使用Redis检索列表中的所有项目,则无需迭代和获取每个单独的项目。这确实是低效的。 您只需要使用LRANGE