Удаление дубликатов результатов с карты (технически не дубликаты)

Я использую 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 иметь уникальные объекты на основе критериев, которые вы внедрили, чтобы различать объекты.

Другие вопросы по тегам