Соответствие строки с токенизацией ключа карты - PullRequest
0 голосов
/ 01 марта 2019

В моей базе данных 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 ANDRIGHT, as: «LEFT | MIDDLE | RIGHT».

Я хочу знать, является ли данная строка ключом на приведенной выше карте.Тем не менее, строка MIDDLE должна быть разделена на значения запятой для этого соответствия.Пример: «A | 1 | B» и «A | 3 | B» должны соответствовать первой записи.Аналогично, «C | 5 | D» соответствует второй записи и т. Д.

Допущения: строка MIDDLE может представлять собой конкатенацию от 1 до 200 чисел (хранится в виде строк).На карте около 35 тыс. Записей.

Я полагаю, что одним простым способом было бы «развернуть» исходную карту и разбить каждую запись на средней строке, чтобы создать несколько новых пар ключ-значение с дублирующимися значениями.Тем не менее, мой размер данных велик, и, следовательно, этот подход будет стоить много времени и пространства.Может ли быть элегантный способ решить эту проблему для производственной среды?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете попробовать что-то подобное (непроверенный код):

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», разбивает строку, используя «|»Разделитель, выбирает второе значение, представляющее собой список чисел, разделяет его с помощью разделителя «,» и преобразует его в список.Таким образом, вы получите список со всеми вашими значениями, которые у вас есть в «СРЕДНИХ».

Затем, в «Точке 2», мы проверяем на совпадения.

Имейте в виду, что этот кодне проверено и не заботится о непредвиденных ситуациях, например, если в вашей строке неверное количество частей, разделенных "|"или если ваш список значений не содержит никакого значения.Возможно, вы захотите настроить его, чтобы учесть эти случаи.

Если вы хотите протестировать большое количество строк, вам, конечно, нужно разделить ключ только один раз.

0 голосов
/ 01 марта 2019

Я бы заменил 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...