Мне кажется, это хороший вариант использования Multimap
, который позволил бы хранить несколько значений для одного ключа.
Google Collections имеет реализацию Multimap
.
Это может означать, что поля ssn
и terminationReason
объекта Person
, возможно, должны быть удалены как ключ и значение соответственно. (И эти поля будут считаться String
.)
По сути, его можно использовать следующим образом:
Multimap<String, String> m = HashMultimap.create();
// In reality, the following would probably be iterating over the
// Person objects returned from the database, and calling the
// getSSN and getTerminationReasons methods.
m.put("0000001", "Reason1");
m.put("0000001", "Reason2");
m.put("0000001", "Reason3");
m.put("0000002", "Reason1");
m.put("0000002", "Reason2");
m.put("0000002", "Reason3");
for (String ssn : m.keySet())
{
// For each SSN, the termination reasons can be retrieved.
Collection<String> termReasonsList = m.get(ssn);
// Do something with the list of reasons.
}
При необходимости можно создать разделенный запятыми список Collection
:
StringBuilder sb = new StringBuilder();
for (String reason : termReasonsList)
{
sb.append(reason);
sb.append(", ");
}
sb.delete(sb.length() - 2, sb.length());
String commaSepList = sb.toString();
Это может быть снова установлено в поле terminationReason
.
Альтернативой, как упоминал Джоник в комментариях, является использование метода StringUtils.join
из Apache Commons Lang можно использовать для создания списка через запятую. *
Следует также отметить, что Multimap
не определяет, должна ли реализация разрешать или не разрешать дублирование пар ключ / значение, поэтому следует посмотреть, какой тип Multimap
использовать .
В этом примере HashMultimap
является хорошим выбором, поскольку он не допускает дублирование пар ключ / значение. Это автоматически устранит любые повторяющиеся причины, приведенные для одного конкретного человека.