Java 从映射中删除重复结果(技术上不重复)

Java 从映射中删除重复结果(技术上不重复),java,deserialization,xml-rpc,xmlrpcclient,Java,Deserialization,Xml Rpc,Xmlrpcclient,我正在使用www.opensubtitles.org API使用文件哈希来获取字幕。 现在,我的问题是,它返回该特定文件的所有可用字幕 例如: 当我选择一个文件下载字幕时,我得到了这个结果 整体结果如下: 他们之间的唯一区别是字幕id和字幕下载链接,其余一切都是一样的 现在我的问题是,这个结果只适用于一个文件,但我将使用多个文件,因此不可能获得最早的结果并使用它 下面给出了检索结果的代码 Map<?, ?> result = (Map<?, ?>) rpcCli

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

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

整体结果如下:

他们之间的唯一区别是字幕id和字幕下载链接,其余一切都是一样的

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

下面给出了检索结果的代码

    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++;
    }
Map result=(Map)rpcClient.execute(“SearchSubtitles”,参数);
对象[]数据=(对象[])结果。获取(“数据”);
映射[]结果=新映射[data.length];
int i=0;
for(对象元素:数据){
结果[i]=(Map)元素;//将其存储在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 result=(Map)rpcClient.execute(“SearchSubtitles”,参数);
对象[]数据=(对象[])结果。获取(“数据”);
映射[]结果=新映射[data.length];
int i=0;
for(对象元素:数据){
系统输出打印项次(元素);
结果[i]=(Map)元素;
i++;
}
List idmbIDs=new ArrayList();
用于(映射:结果){
String=(String)map.get(“IDMovieImdb”);
如果(!idmbIDs.contains(字符串))
添加(字符串);//存储不同的idmb ID。
}
List removedIDMBids=new ArrayList();
for(字符串存储:idmbIDs){
用于(映射:结果){
if(store.contains((String)map.get(“IDMovieImdb”)&&&!removedIDMBids.contains(store)){
removedIDMBids.add(存储);
fileDetails.add(map);
}
}
}
for(映射realResult:fileDetails){

System.out.println(realResult);我宁愿创建一个覆盖了
equals(
@Override
)(重新实现)的
Subtitle
类,在那里我将区分对象在哪里等于或不等于

您的
Subtitle
类将具有您在响应中获得的所有属性,如
系列MDBParent
IDSubtitle


在该对象上,您可以创建一个构造函数(或方法
load
),该构造函数接收一个
Map[]
参数,您将使用该参数将值加载到该对象。或者您可以更聪明地使用该方法,这将帮助您自动完成此工作

然后,您的代码将类似于:

    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)
Map result=(Map)rpcClient.execute(“SearchSubtitles”,参数);
字幕字幕=新字幕();
mapper.map(结果,副标题)
)


在此之后,在实现了
equals
hashCode
方法之后,您将能够使用
集合
(例如)这将迫使
设置
根据您实现的区分对象的标准拥有唯一的对象。

好的,在要求我们修复您的代码之前……您自己尝试过吗?在花了五分钟以上的时间(在您充分休息的时候)之后,您的清理代码是什么?第二:堆栈溢出最适用于特定的技术问题。这是一个关于重构代码的非常普遍的问题……它也不适合。您是否可以将您的问题重新表述为一个特定的、有答案的技术问题,而不是“帮助我改进代码”?您可以在该对象上创建一个构造函数(或方法加载)接收一个Map[]参数,您将使用该参数将值加载到对象。“请您再次解释一下,好吗?不,我不会使用推土机,因为我不知道它是什么,我真的没有时间学习它。(这是我必须提交的项目).非常感谢您的回答。是的。我不知道equals和hashcode Lol。谢谢!