繁体   English   中英

字符串匹配,用于标记地图的键

[英]String matching with tokenizing the key of a map

我的Dynamo DB中有一张地图,如下所示:

"A|1,2,3,4|B" : "[some data]"
"C|5,6|D" : "[some data]"
"X|7,8,9,10,11,12,13|Y" : "[some data]"
 ..

为了便于讨论,我们假设上面地图中的每个键都是三个字符串LEFT,MIDDLE和RIGHT的连接结果,如:“LEFT | MIDDLE | RIGHT”。

我想知道给定的字符串是否是上述地图中的关键字。 但是,应将MIDDLE字符串拆分为此匹配的逗号值。 示例:“A | 1 | B”和“A | 3 | B”都应与第一个条目匹配。 类似地,“C | 5 | D”匹配第二个条目,依此类推。

假设:MIDDLE字符串可以是1到200个数字的串联(存储为字符串)。 该地图有大约35K条目。

我想,一种直接的方法是“扩展”原始地图并分解中间字符串上的每个条目以创建具有重复值的多个新键值对。 但是,我的数据量很大,因此这种方法会花费大量的时间和空间复杂性。 能否以优雅的方式为生产环境解决这个问题?

例如,我会用一些随机字符串替换MIDDLE

"A|4806369425|B" : "[some data M]"
"A|0848833569|B" : "[some data N]"
"A|5514390566|B" : "[some data P]"

添加另一个映射

"1" : "4806369425"
"2" : "4806369425"
"3" : "4806369425"
"4" : "4806369425"
"5" : "0848833569"
"6" : "0848833569"
"7" : "5514390566"
"8" : "5514390566"
"9" : "5514390566"
...
"13" : "5514390566"

在获取值时,我会转到第二个映射,找到中间的键。 它应该在O(1)中执行,然后左右连接并在O(1)中再次从第一个映射中获取一些数据

你可以尝试类似的东西(未经测试的代码):

String testString = "A|1,2,3,4|B"

String primarySeparator = "|";
String secondarySeparator = ",";

public boolean contains(String key) {
  String[] parts = testString.split(primarySeparator);
  List<String> values = Arrays.asList(parts[1].split(secondarySeparator)); // Point 1

  String[] keyParts = key.split(primarySeparator);

  if (keyParts[0].equals(parts[0])
    && keyParts[2].equals(parts[2]
    && values.contains(keyParts[1])) { // Point 2
    return true;
  } else {
    return false;
  }
}

标记为“Point 1”的行使用“|”拆分字符串 分隔符,选择第二个值,即您的数字列表,使用“,”分隔符将其拆分并将其转换为列表。 因此,您将获得一个包含“MIDDLE”中所有值的列表。

然后,在“Point 2”,我们测试匹配。

请记住,此代码未经测试且不关心意外情况,例如,如果您的字符串没有以“|”分隔的正确数量的部分 或者,如果您的值列表不包含任何值。 您可能需要进行调整以便将这些情况考虑在内。

如果你想测试大量的行,你当然应该只拆分一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM