Насколько я понял вашу проблему, вы должны хранить произвольные списки имен для каждого автора и эффективно их сопоставлять.
Я предполагаю, что вы решили проблему синтаксического анализа имен, удаления несущественных/необязательных частей, таких как «Dr», и сохранения частиц, таких как «von» и «de». Ваше нормализованное имя должно быть последовательностью строк в фиксированном регистре (нижний регистр в порядке, хотя я бы придерживался верхнего регистра или заглавного регистра).
Теперь List<String>
или String[]
будут работать как ключ к HashMap
, содержащему другие детали. Боюсь, это не сработает, так как оба они изменяемы, и я не уверен, что их hashCode()
методы подходят для этого случая.
Поэтому я бы придумал что-то вроде этого:
class AuthorName(object) {
private String[] parts;
public AuthorName(String... name_parts) {
assert name_parts.length > 0;
parts = name_parts;
}
@Override
public int hashCode() {
// hashCode() that only depends on name parts
int result = 0;
for (int i=0; i < parts.length; i+=1) result ^= part.hashCode();
return result;
}
}
Map<AuthorName, ...> authors = new HashMap<AuthorName, ...>();
authors.put(new AuthorName('John', 'Doe'), ...);
assert authors.get(new AuthorName('John', 'Doe')) != 0
Это не решает многих возможных проблем, таких как «случайный пользователь Joe», «пользователь Joe R» и «J. R. Пользователь» может быть одним и тем же лицом. Это должно решаться на другом уровне.
Если бы вы изложили свой случай более подробно, с примером или двумя, ответы могли бы быть лучше.
Вас также может заинтересовать способ, которым библиотеки нормализуют имена авторов. Люди используют усложнять схемы для соответствия именам.
person
9000
schedule
15.10.2012