字符串匹配并标记化地图的键

时间:2019-03-01 09:59:40

标签: java algorithm data-structures

我的Dynamo数据库中有一个这样存储的地图:

"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个数字的串联(存储为字符串)。该地图有大约35,000个条目。

我认为一种简单的方法是“扩展”原始映射并分解中间字符串上的每个条目,以创建多个具有重复值的新键值对。但是,我的数据量很大,因此这种方法将花费大量时间和空间。在生产环境中是否可以有一种优雅的方法来解决此问题?

2 个答案:

答案 0 :(得分:3)

例如,我将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)中从第一个映射中获取一些数据

答案 1 :(得分:0)

您可以尝试类似的操作(未经测试的代码):

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;
  }
}

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

然后,在“点2”处测试匹配项。

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

如果要测试大量的行,则当然应该只将密钥分割一次。