我是MCS的二年级学生。我正在用Java做一个项目,我有不同的图像。为了存储说IMAGE-1的描述,我有一个名为IMAGE-1的ArrayList,类似于IMAGE-2 ArrayList IMAGE-2 n等......
现在我需要开发一个搜索引擎,我需要找到一个所有图像的描述与搜索引擎中输入的单词匹配..........
FOR EX 如果我输入“computer”,那么我应该能够找到描述中包含“computer”的所有图像。
所以我的问题是......
我该如何有效地做到这一点?
我应该如何保持这些 ArrayList因为我可以拥有100个 这样...?或者我应该使用另一个 数据结构而不是ArrayList?
答案 0 :(得分:2)
一个简单的实现是标记化描述,并使用Map<String, Collection<Item>>
存储令牌的所有项目。
大厦:
for(String token: tokenize(description)) map.get(token).add(item)
(需要一个集合,因为可以找到令牌的多个条目。代码中缺少集合的初始化。但是这个想法应该是清楚的。)
使用:
List<Item> result = map.get("Computer")
在这种情况下,通用HashMap实现不是最有效的。当您开始遇到内存问题时,您可以查看更有效的树实现(例如radix trees - implementation)。
下一步可能是使用一些(内存中)数据库。这些可以是关系型(HSQL)或不是(Berkeley DB)。
答案 1 :(得分:1)
如果您有少量图像和简短描述(<1000字符),请将它们加载到数组中并使用String.indexOf()
搜索单词(即数组中的一个条目==一个完整的图像描述) 。这对于例如少于10,000张图像来说足够有效。
使用toLowerCase()
折叠字符大小写(因此用户在键入“computer”时会找到“Computer”)。 String.indexOf()
也适用于简短的单词(使用“comp”查找“计算机”或“比较”)。
如果您有大量图片和详细说明和/或您希望为用户提供搜索的一些舒适感(例如Google),请使用Lucene。
答案 2 :(得分:1)
没有简单易用的数据结构支持高效的全文搜索。
但你真的需要效率吗?这是桌面应用还是网络应用?在前一种情况下,不要担心效率,现代CPU可以在几分之一秒内搜索数兆字节的文本 - 只需使用String.contains()
(或正则表达式以允许更灵活的搜索)查看所有描述。
如果您确实需要效率(例如,对于许多人可以同时进行搜索的网络应用),请查看Apache Lucene。
对于您的ArrayLists,使用一个来描述单个图像似乎很奇怪。为什么列表,索引代表什么?行?如果是这样,除非您确实需要直接访问行,否则请使用简单的String替换列表 - 它可以包含换行符。
答案 3 :(得分:0)
我建议您使用Hashtable类或将内容组织到树中以优化搜索。