我有一个结构:
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/