我有这个代码。这是搜索excel csv并创建.txt文件,缺少电影字幕。一部电影可以有一个或两个,三个或四个字幕。在excel中,每种语言都写成Y或N.它适用于一种语言(INDO)。我在excel和这里添加了其他语言(GBR,SIM,MYS)。
int INDOSUB = 4;
int GBRSUB = 5;
int SIMSUB = 6;
int MYSSUB = 7;
int KPPNAME = 1;
...
//NEW REQUIREMENT, CHECK PLAYLIST FOR MISSING SUBTITLES
for(int i=0; i < assets.size(); i++)
{
try
{
file = new File(assets.get(i));
fileReader = new FileReader(file);
bufferedReader = new BufferedReader(fileReader);
while((line = bufferedReader.readLine()) != null)
{
tmp = line.split(",");
if(tmp.length > 4)
{
String indosubStatus = tmp[INDOSUB];
String gbrsubStatus = tmp[GBRSUB];
String simsubStatus = tmp[SIMSUB];
String myssubStatus = tmp[MYSSUB];
String kppKey = tmp[KPPNAME];
if(indosubStatus.equals("N"))
{
kppSubitleMap.put(kppKey,"NO INDO SUBTITLES");
kppWithMissingSub.put(tmp[KPPNAME],"");
}
if(gbrsubStatus.equals("N"))
{
kppSubitleMap.put(kppKey,"NO GBR SUBTITLES");
kppWithMissingSub.put(tmp[KPPNAME],"");
}
if(simsubStatus.equals("N"))
{
kppSubitleMap.put(kppKey,"NO SIM SUBTITLES");
kppWithMissingSub.put(tmp[KPPNAME],"");
}
if(myssubStatus.equals("N"))
{
kppSubitleMap.put(kppKey,"NO MYS SUBTITLES");
kppWithMissingSub.put(tmp[KPPNAME],"");
}
}
}
}
catch(IOException ex)
{
System.out.println(ex.toString());
}
}
运行时只显示此信息。我相信KPP_Heartless也没有GBR和SIM字幕。但它只显示了最后一个。所以它似乎压倒了以前的记录。
KPP_HEARTLESS_19 - NO MYS SUBTITLES
DATE/TIME: 1/11/2017 - 23:45:09:20
DATE/TIME: 1/12/2017 - 04:45:07:21
DATE/TIME: 1/12/2017 - 12:30:08:20
DATE/TIME: 1/12/2017 - 17:30:04:19
KPP_LISTEN_07 - NO INDO SUBTITLES
DATE/TIME: 1/12/2017 - 03:30:11:24
DATE/TIME: 1/12/2017 - 07:30:13:13
DATE/TIME: 1/12/2017 - 15:00:10:10
KPP_LISTEN_08 - NO INDO SUBTITLES
DATE/TIME: 1/12/2017 - 20:00:10:05
KPP_HEARTLESS_20 - NO MYS SUBTITLES
DATE/TIME: 1/12/2017 - 23:45:09:19
有人知道如何防止它超越吗?非常感谢你。
答案 0 :(得分:3)
与覆盖方法无关。
问题来自于你写的时候:
kppSubitleMap.put(kppKey,"NO SIM SUBTITLES");
kppWithMissingSub.put(tmp[KPPNAME],"");
您将覆盖与该键相关联的值。
1)如果要在地图中包含多个值,可以使用List或Set作为值。例如:Map<String, List<String>>
。
以下是您应该使用kppSubitleMap
地图执行的示例,但问题与kppWithMissingSub
相同。
if(gbrsubStatus.equals("N")){
List<String> values = kppSubitleMap.get(kppKey);
if (values = null){
values = new ArrayList<String>();
}
values.add("NO GBR SUBTITLES");
kppSubitleMap.put(kppKey, values);
...
}
锅炉板代码应以实用方法执行,以避免在每个if
块中重复:
public List<String> getOrCreateList(Map<String,List<String>> map, String key){
List<String> values = map.get(kppKey);
if (values = null){
values = new ArrayList<String>();
}
return values;
}
2)如果你想简单地连接信息,你可以这样做:
String value = kppSubitleMap.get(kppKey);
if (value==null){
value = "";
}
value += "NO GBR SUBTITLES");
kppSubitleMap.put(kppKey, value );
答案 1 :(得分:0)
当您多次调用Map.put()时,Map只包含同一个键的最后一个值。你可以使用Map<String, Set<String>>
例如:
Set<String> values = kppSubitleMap.get(kppKey);
if (values == null) {
values = new HashSet<>();
kppSubitleMap.put(kppKey, values);
}
values.add("NO GBR SUBTITLES")