java - 在java中搜索列表中对象的最快方法

标签 java search parallel-processing hashmap

我有一个结构:

public class DataItem {
    public int wordID, categoryID, documentID, count;
}

我有一个如下所示的列表:

final public ArrayList<DataItem> data = new ArrayList<>();

我编写了一个在其中搜索的方法:

public DataItem FindDataItem(final int wordID, final int categoryID, final int documentID)
{
    for(DataItem dataItem : data)
        if(dataItem.wordID == wordID && dataItem.documentID == documentID && dataItem.categoryID == categoryID)
            return dataItem;
    return null;
}

但是太慢了。我怎样才能加快速度?

我正在考虑四个彼此内部的HashMap,但我想像数据库表一样使用这些数据,因此很难在HashMap中按计数进行分组

我也在考虑ParalellStream,但我不知道如何使用它。看起来很复杂。但仍然是 O(n)。

我也在考虑使用数据库。但我不想有IO。我希望它全部都在 RAM 中。

请指导我完成这个任务。

最佳答案

正如 @ShreyasSarvothama 在评论中所说,检索值的最快方法是使用 Map。

我认为您可以使用一个映射,其键是根据用作 find 方法参数的值来计算的(考虑到它们的组合给出了 DataItem 的唯一标识符)。

import java.util.*;
import java.util.stream.*;

public class Test {

    private class DataItem {
        public int wordID, categoryID, documentID, count;

        public DataItem(int w, int c, int d) {
            wordID = w;
            categoryID = c;
            documentID = d;
        }

        public String toString() {
            return "wordID:" + wordID + " categoryID:" + categoryID + " documentID:" + documentID;
        }
    }

    private Map<Integer, DataItem> map;

    public void setList(List<DataItem> list) {
        this.map = list.stream().collect(Collectors.toMap(dataItem -> dataItem.wordID * dataItem.categoryID * dataItem.documentID, dataItem -> dataItem));        
    }

    public DataItem getDataItem(int wordID, int categoryID, int documentID) {
        return map.get(wordID * categoryID * documentID);
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.setList(Arrays.asList(t.new DataItem(1,2,3), t.new DataItem(2,3,4), t.new DataItem(3,3,4)));
        System.out.println(t.getDataItem(2,3,4));
    }
}

希望有帮助。

关于java - 在java中搜索列表中对象的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408541/

相关文章:

Java获取匹配范围的最快方法

java - 'parallelizing' 我的 for 循环是正确的选择吗? (没有 JNI/OPENMP)

java - 如何对 hadoop 中的所有键/值对进行一般化简

java - 获取资源文件夹中文件的位置作为字符串

java - "Variable not initialized"错误

java - Spring配置初始化方法

algorithm - 在 log(n) 时间内排序的 bool n*n 矩阵中 0 的数量

java - 在 SD 卡上组织数据以便快速搜索的最佳方式

c# - Parallel.ForEach 循环的执行方式类似于串行循环

java - 如何在 Java 中实现 WebSocket 服务器?