У меня есть следующие Set<String>
объекты.
"A_B_C_D_E_F_G",
"A_B_C_D_E_X_G",
"A_B_C_D_E_Z_G",
"A_B_C_X_Y_F_G",
"P_B_C_D_E_F_G",
"A_C_N_D_E_F_G"
... and 10,000 more
Каждая строка представляет собой разделенный подчеркиванием список уникальных идентификаторов.Итак, чтобы помочь вам понять, вы можете думать о каждой строке следующим образом:
String[] uniqueIds = string.split("_");
Что я хочу сделать, это поместить каждую строку в Collection<String>
, где строки сгруппированы, если отличается только один uniqueId,и различие возникает в том же «столбце».
Так что, если бы мы перебрали объекты Set<String>
в примере, показанном выше, произошли бы следующие группировки
Group1
"A_B_C_D_E_F_G",
"A_B_C_D_E_X_G", (because X is different than F)
"A_B_C_D_E_Z_G", (because Z is different than F, and because Z and X are
in the same column)
Group2
"P_B_C_D_E_F_G", (because P is different than A, and is not the same column as
in Group1)
Group3
"A_B_C_X_Y_F_G", (because X is different than D, and is not the same column as
in Group1 or Group2)
(because Y is different than E, and is not the same column as
in Group1 or Group2)
Group4
"A_C_N_D_E_F_G", (because C is different than B, and is not the same column as
in Group1 or Group2 or Group 3)
(because N is different than C, and is not the same column as
in Group1 or Group2 or Group 3)
Я пытаюсьвыяснить наиболее эффективный способ создания этих группировок.
Моим первоначальным предположением было бы начать с пустого Map<someKey,Collection<String>>
.
Затем перебрать Set<String>
, разбить каждую строку на массив uniqueId и пройти по карте в поисках * 1021.* который бы указывал, принадлежит ли эта строка в текущей коллекции или входит в новую коллекцию с другим someKey
.Определение значения someKey
может быть немного сложным ... может быть, это будет список номеров столбцов, разделенных подчеркиванием, значения которых изменились со времени первой строки?
Поскольку каждая строка содержит много символов uniqueIds
, а размер Set<String>
может составлять 10000. Казалось бы, этот алгоритм может работать медленно.
Есть предложения?
Спасибо!
ОБНОВЛЕНИЕ :::
В некоторых случаях строка может входить в более чем 1 группу.Если это так, он будет помещен в первую доступную группу, которая соответствует критериям.