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

迭代列表性能

鲜于阳成
2023-03-14

我需要一个解决方案来提高这种方法的性能。我需要使用LinkedHashMap按顺序插入这些输入,它工作得很好。然而,我不喜欢这个解决方案,因为我有一个列表,每次我都要通过它来检索我想插入到这个地图中的输入。

这是我的密码

public void prepareData(final List<Category> categories, final Map<String, Boolean> preferencesMap) {
    preferencesMap.put("ACCESSORIES",checkDataFromList(categories, "ACCESSORIES"));
    preferencesMap.put("WATCHES",checkDataFromList(categories, "WATCHES"));
    preferencesMap.put("PHONES",checkDataFromList(categories, "PHONES"));
}

private Boolean checkDataFromList(final List<Category> categories, final String val){
    for (Category category: categories) {
        if(val.equalsIgnoreCase(category.getCode()) && category.isActive() != null){
            return !category.isActive();
        }
    }
    return Boolean.FALSE;
}

我需要一种方法来检索这些对象,而无需重复此列表3次。

共有2个答案

黄扬
2023-03-14

试试这个实现。按类别循环一次。

    public void prepareData(final List<Category> categories, final Map<String, Boolean> preferencesMap) {
        List<String> predefinedCategories = Stream.of("ACCESSORIES", "WATCHES", "PHONES").collect(Collectors.toList());
        predefinedCategories.forEach(predefineCategory -> preferencesMap.put(predefineCategory, Boolean.FALSE));

        for(Category category: categories) {
            predefinedCategories.stream().filter(val -> val.equalsIgnoreCase(category.getCode()) && category.isActive() != null)
                                         .findFirst()
                                         .ifPresent(existingCategoryCode ->
                                         {
                                             preferencesMap.put(existingCategoryCode, !category.isActive());
                                             predefinedCategories.remove(existingCategoryCode);
                                         });
            if (predefinedCategories.isEmpty()) {
                break;
            }
        }
    }
金阳曜
2023-03-14

我想分享我的见解,也许这不是你问题的答案。我试着列出似乎有帮助的可能性。

我认为你不能用这种数据结构做很多事情。您已经将数据收集到了一个列表中,这就是为什么您无法以更简单的方式通过其属性找到列表成员。这就是为什么在搜索一个项目时,你需要反复浏览这个列表的原因。

基本上,你有两个选择,保持基本数据结构,List

>

私人地图

我不推荐这种解决方案。我相信这会使代码更难理解,而且可能不会产生太多性能。

改变数据结构——我想到的第一件事就是映射。你可以通过代码来映射这些类别。这样你就不需要反复浏览列表了。使用Map

1通常可以通过使数据结构项具有可比性,然后使用排序结构来提高性能。此外,如果有任何意义,您可以尝试使用缓存。

 类似资料:
  • 主要内容:如何为每一行添加序号?本文章将介绍Thymeleaf标准表达式语法中的概念。我们将使用标记在模板中迭代产品列表。 编辑源代码以便将产品列表显示为表格行。已经将类的对象列表设置为具有变量名称的上下文模型(参考:中的实现)。 如果要上机实践,请参考:Thymeleaf+SpringMVC5示例项目。这里不再重复创建项目的过程,这里将只介绍如何使用标准表达式和标签。 这里创建一个Maven Web项目: thymeleaf-

  • 我正在尝试迭代一个列表,并尝试将该值打印为: 但是,只打印列表的大小,而不是在JSTL中定义的。有人帮忙吗?我想打印对象的所有属性。

  • 有没有办法在Spring迭代列表或地图?我无法在网上找到任何参考资料。 这就是我的定义- 我不想创建多个bean对象,而是想使用以下逻辑遍历这个列表并创建一个映射- 我能在Spring做这个吗?

  • 问题内容: 我有一个清单: 要从此列表中获取,有两种方法: 1。 2。 我的问题是,哪一个内存效率高且迭代速度快? 问题答案: 他们做同样的事情- 增强的循环对于长版本来说只是语法糖(对于可迭代对象;对于数组,它稍有不同)。除非您明确需要迭代器(例如,调用),否则我将使用第一个版本。 有关编译器执行的准确转换的更多详细信息,请参见Java语言规范的14.14.2节。

  • 问题内容: 如果我在java中的链表上使用了for-each循环,是否可以保证以它们在列表中出现的顺序迭代元素? 问题答案: 保证链表按顺序运行。 从文档中 有序集合(也称为序列)。该界面的用户可以精确控制列表中每个元素的插入位置。用户可以通过其整数索引(列表中的位置)访问元素,并在列表中搜索元素。 iterator() 以适当的顺序返回此列表中元素的迭代器。

  • 问题内容: 我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目? 还是应该迭代列表索引?像那样: 问题是:以上两种方式都是允许的,还是只有第二种是没有错误的? 如果答案是肯定的,以下代码段是否有效? UPD。我想在python文档中看到“允许这些操作”而不是某人的假设。 问题答案: 可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为