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



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

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

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

整个结果如下:http://privatepaste.com/download/22bb756930

它们之间唯一的区别是字幕id和字幕下载链接rest一切都是一样的。

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

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

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个文件时,我只想为每个文件存储一个结果,而不是在上面的情况下存储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");获得下载量最大的字幕,那就太好了

如有任何帮助,我们将不胜感激。如果我不能很好地解释,请原谅。请不要否定。

我宁愿创建一个具有equals覆盖(@Override)(重新实现)的Subtitle类,在那里我将区分对象在哪里等于或不等于。

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

在该对象上,您可以创建一个构造函数(或方法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)

在此之后,在实现了equalshashCode方法后,您将能够使用Set<Subtitle>(例如),它将根据您实现的区分对象的标准强制Set具有唯一的对象。

最新更新