【问题标题】:Removing duplicate results from a Map (Not techinally duplicate)从地图中删除重复的结果(技术上不重复)
【发布时间】:2014-03-04 21:50:04
【问题描述】:

我正在使用 www.opensubtitles.org API 来使用文件哈希获取字幕。 现在,我的问题是它返回了该特定文件的所有可用字幕。

例如: 当我选择一个文件下载字幕时,我得到了这个结果

http://i.stack.imgur.com/m2tZM.png

整个结果在这里:http://privatepaste.com/download/22bb756930

它们之间的唯一区别是字幕ID和字幕下载链接其余一切都相同。

现在我的问题是这个结果仅适用于 1 个文件,但我将使用多个文件,因此不可能获得第一个结果并使用它。

获取结果的代码如下

    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");获得下载次数最多的字幕,那就太好了

任何帮助将不胜感激。 如果我无法正确解释,请原谅我。 请不要否定。

【问题讨论】:

  • 好的,在要求我们修复您的代码之前……您尝试过自己做吗?在花费超过 50 分钟后(在您休息良好的时候),您清理过的代码是什么?
  • 其次:Stack Overflow 最适合解决特定的技术问题。这是关于重构代码的一个非常普遍的问题......它也不适合。您能否将您的问题重新表述为一个有答案的具体技术问题,而不是“帮助我改进我的代码”?

标签: java deserialization xml-rpc xmlrpcclient


【解决方案1】:

我宁愿创建一个带有equals 覆盖(@Override)(重新实现)的Subtitle 类,并且我将在那里区分对象是否相等。

您的Subtitle 类将具有您在响应中获得的所有属性,例如SeriesIMDBParentIDSubtitle 等。

在该对象上,您可以创建一个构造函数(或方法load),它接收一个Map&lt;?, ?&gt;[] 参数,您将使用该参数将值加载到对象。或者您可以更聪明地使用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)

;

在此之后并实现了equalshashCode 方法,您将能够使用Set&lt;Subtitle&gt;(例如)这将强制Set 根据您实现的标准拥有唯一的对象区分对象。

【讨论】:

  • “在该对象上,您可以创建一个构造函数(或方法加载),它接收 Map, ?>[] 参数,您将使用该参数将值加载到对象。”你能再解释一下吗?不,我不会使用推土机的东西,因为我不知道它是什么,而且我真的没有时间学习它。 (这是我必须提交的项目)。非常感谢您的回答。
  • 是的。我不知道equals和hashcode Lol。谢谢!
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 2015-12-06
  • 2017-04-25
  • 2015-12-19
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
相关资源
最近更新 更多