Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在较大的字符串集合中查找较大的字符串集合_Java_Algorithm - Fatal编程技术网

Java 在较大的字符串集合中查找较大的字符串集合

Java 在较大的字符串集合中查找较大的字符串集合,java,algorithm,Java,Algorithm,我有一个要筛选的字符串集合。它们将以这种模式出现: xxx_xxx_xxx_xxx 所以总是一系列字母或数字,由三个下划线分隔。每个字符串的最大长度为60个字符。我的收藏中可能有几百万个这样的 我可以使用什么样的数据结构来高效地执行以下操作: 获取所有字符串以“abc_123_456”开头 获取所有字符串以“def_999_888”开头 等等 例如,我可以这样做: List<String> matched = new ArrayList<String>(); for (

我有一个要筛选的字符串集合。它们将以这种模式出现:

xxx_xxx_xxx_xxx
所以总是一系列字母或数字,由三个下划线分隔。每个字符串的最大长度为60个字符。我的收藏中可能有几百万个这样的

我可以使用什么样的数据结构来高效地执行以下操作:

获取所有字符串以“abc_123_456”开头

获取所有字符串以“def_999_888”开头

等等

例如,我可以这样做:

List<String> matched = new ArrayList<String>();
for (String it : strings) {
    if (it.startsWith(match)) {
        matched.add(it);
    }
}
我很好奇,如果java/C/C++中的自定义内容可以使用上面的编码平面字符串运行得更快:

myusername\u prodIdA\u prodIdB\u推荐用户名

其思想是,您可以从对整个编码字符串集合进行操作开始,以获得答案

我知道,尝试实现这样的定制解决方案很可能在生产环境中不可用,因此一些sql db会更好,只是好奇


感谢您在Java中这样做,您可以使用结构

尽管如此,我认为这不是一个好主意。在内存中转储“几百万”记录并不总是有效的


这就是数据库的用途;通过正确的设计和适当的索引,您可以单独使用DB获得非常好的性能。

我想您正在寻找一个SortedMap

“头像图(K-toKey) 返回此映射部分的视图,其密钥严格小于toKey。”

我知道尝试实现这样的自定义解决方案很可能在生产环境中不可用,因此一些sql db会更好,只是好奇而已

如果只是出于好奇,您可以将所有现有的不同“myusername\u prodIdA\u prodib”组合放入哈希表中。对于每个组合,存储相关结果的列表

因此,该结构看起来像
Map
,使用起来像
hash.get(“def_999_888”)
。恒定时间(O(1))


你可以去掉内部列表,并以多种方式对其进行优化,但这正是我的想法。

我想到的第一件事是将字符串预处理成某种数据结构,以便高效地搜索它们。如果要多次调用搜索函数,我认为最好将所有字符串放入哈希表中,以便进行固定时间的查找。构造字符串数组需要更多的处理能力,但这会使搜索字符串的任务变得简单。

id:s实际上是base-n数字吗?我在想一种优化方法,可以帮助你更快地解析和过滤它们……我不明白——为什么你需要找到小于给定值的字符串来实现你的特定高级目标?有什么联系?我想你需要详细说明。ID都是字母数字,ascii码。这个概念是,我可以将特定格式的键写入内存。然后,给定一个用户名和两个产品ID,我的朋友的所有推荐都可以通过对整个数据集进行[less-than]操作来找到匹配项。这有点不可靠!顺便说一句,这篇文章有矛盾之处。首先,您说“获取小于的所有字符串”,但在代码示例中,您使用“startsWith”而不是“lessThan”。你想要哪一个?@Nikita,你是对的,应该是“startsWith”@NullUserException这就是为什么map有列表值,而不是字符串。是的,我只是在想,因为我想知道一个特定的自定义实现是否比使用mysql等更好。
select recommender from recs where username='me' and prodIdA='a' and prodIdB='b';