私があなたの問題を理解している限り、著者ごとに名前の任意のリストを保存し、それらを効率的に照合する必要があります。
名前を解析し、「Dr」などの必須ではない/オプションの部分を削除し、「von」や「de」などの粒子を保持するという問題を解決したと思います。正規化された名前は、固定された大文字の文字列のシーケンスでなければなりません (小文字でも構いませんが、大文字またはタイトル ケースを使用します)。
ここで、List<String>
orは、他の詳細を含む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 Random User'、'Joe R User'、および 'JR User' が同一人物であるなど、考えられる多くの問題に対処していません。これは、別のレベルで対処する必要があります。
例を 1 つまたは 2 つ挙げて、より詳細にケースを説明すると、より良い回答が得られる可能性があります。
ライブラリが著者名を正規化する方法にも興味があるかもしれません。人々は名前を一致させるために精巧な スキームを使用します。