Удаление дубликатов результатов с карты (технически не дубликаты)
Я использую www.opensubtitles.org API для получения субтитров с помощью хэша файла. Теперь моя проблема в том, что он возвращает все доступные субтитры для этого конкретного файла.
например: я получаю этот результат, когда выбираю один файл для загрузки субтитров
Весь результат здесь: http://privatepaste.com/download/22bb756930
Единственная разница между ними заключается в идентификаторе субтитров и ссылках на загрузку субтитров, а все остальное одинаково
Теперь моя проблема в том, что этот результат только для одного файла, но я буду использовать несколько файлов, поэтому невозможно получить первый самый результат и использовать его.
Код для получения результата приведен ниже
Map<?, ?> result = (Map<?, ?>) rpcClient.execute("SearchSubtitles", params);
Object[] data = (Object[]) result.get("data");
Map<?, ?>[] results = new Map<?, ?>[data.length];
int i = 0;
for (Object element : data) {
results[i] = (Map<?, ?>) element; //storing it in map
i++;
}
Теперь я хочу, чтобы при выборе, скажем, 12 файлов, я хотел, чтобы для каждого из них был сохранен только 1 результат, а не 3 в приведенном выше случае.
Я все заработал, но мой код явно не очень хороший. Я написал это в 3 часа утра и занял у меня 5 минут, потому что моей единственной целью было заставить его работать.
Map<?, ?> result = (Map<?, ?>) rpcClient.execute("SearchSubtitles", params);
Object[] data = (Object[]) result.get("data");
Map<?, ?>[] results = new Map<?, ?>[data.length];
int i = 0;
for (Object element : data) {
System.out.println(element);
results[i] = (Map<?, ?>) element;
i++;
}
List<String> idmbIDs = new ArrayList<String>();
for (Map<?, ?> map : results) {
String string = (String) map.get("IDMovieImdb");
if (!idmbIDs.contains(string))
idmbIDs.add(string); //stores distinct idmb ids.
}
List<String> removedIDMBids = new ArrayList<String>();
for (String store : idmbIDs) {
for (Map<?, ?> map : results) {
if (store.contains((String) map.get("IDMovieImdb")) && !removedIDMBids.contains(store)) {
removedIDMBids.add(store);
fileDetails.add(map);
}
}
}
for (Map<?, ?> realResult : fileDetails) {
System.out.println(realResult); <- this does what I want
}
Я хочу лучший способ сделать что-то подобное. Было бы здорово, если бы я мог получить самые загруженные субтитры, используя (map.get("SubDownloadsCnt");
Любая помощь будет оценена. Простите, если я не могу объяснить это должным образом. и, пожалуйста, не отрицай.
1 ответ
Я предпочел бы создать Subtitle
класс с equals
переопределить (@Override
) (повторно реализовано), и там я буду различать, где равны объекты или нет.
Ваш Subtitle
класс будет иметь все свойства, которые вы получите в ответе, как SeriesIMDBParent
, IDSubtitle
, так далее.
На этом объекте вы можете создать конструктор (или метод load
) который получает Map<?, ?>[]
параметр, который вы будете использовать для загрузки значений в объект. Или вы можете быть умнее и использовать Dozer Mapping, который поможет вам выполнять эту работу автоматически.
И тогда ваш код будет выглядеть примерно так:
BeanMappingBuilder builder = new BeanMappingBuilder() {
protected void configure() {
mapping(Map.class, Subtitle.class, mapNull(false))
.
.
.
}
}
После настройки сопоставления вы должны сделать это с помощью:
Map<String, Object> result = (Map<String, Object>) rpcClient.execute("SearchSubtitles", params);
Subtitle subtitle = new Subtitle();
mapper.map(result, subtitle)
;
После этого и осуществив equals
а также hashCode
методы, вы сможете использовать Set<Subtitle>
(например), который заставит Set
иметь уникальные объекты на основе критериев, которые вы внедрили, чтобы различать объекты.