我正在使用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");
任何帮助将不胜感激。 请原谅我,如果我无法正确解释它。 请不要否定。
答案 0 :(得分: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
具有唯一性对象基于您实现的区分对象的标准。