2017-01-10 1 views
2

Ich habe diesen Code. Whis sucht Excel-CSV und erstellt .TXT-Datei mit fehlenden Untertiteln für Filme. Ein Film kann einen oder zwei oder drei oder vier Untertitel haben. In Excel wird es für jede Sprache als Y oder N geschrieben. Es funktioniert für eine Sprache (INDO). Ich habe andere Sprachen (GBR, SIM, MYS) in Excel und hier hinzugefügt.Wie zu verhindern, dass Methode in Java überschreiben

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()); 
     }    
    } 

Wenn es läuft, zeigt es nur das an. Und ich bin sicher, KPP_Heartless hat keine GBR- und SIM-Untertitel. Aber es zeigt nur den letzten. So scheint es seine vorrangige vorherige Aufzeichnung.

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 

Weiß jemand, wie es zu verhindern, dass überschreiben? Vielen Dank.

+0

Wie soll ich das anwenden? Weil ich denke .. Ich muss kppKey = tmp [KPPNAME] überprüfen, wenn es existiert. Wenn es vorhanden ist, überschreiben Sie es nicht mit einem neuen Wert, sondern fügen einen neuen Wert hinzu. Und ich glaube nicht, dass ich das Finale für String ** verwenden kann, das war die Antwort für jemanden, der einen Vorschlag für das Finale hat. – Burco

+0

Sie waren wahrscheinlich verwirrt, es gibt einen Unterschied zwischen "überschreiben" und "überschreiben", und das machst du Letzteres. –

Antwort

3

Es verwenden keine Beziehung mit zwingender Methode hat.

Die Probleme kommt, dass, wenn Sie schreiben:

kppSubitleMap.put(kppKey,"NO SIM SUBTITLES"); 
kppWithMissingSub.put(tmp[KPPNAME],""); 

Sie den Wert auf dem Schlüssel zugeordnet ist überschrieben.

1) Wenn Sie mehrere Werte in der Karte haben möchten, können Sie eine Liste oder ein Set als Werte verwenden. Zum Beispiel: Map<String, List<String>>.

Hier ist ein Beispiel, was Sie mit der kppSubitleMap Karte tun sollten, aber das Problem ist das gleiche mit 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); 
    ... 
    } 

Der Kesselblech Code sollte in einem Dienstprogramm-Verfahren durchgeführt werden, um sie in jedem if Block zu vermeiden wiederholen:

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) Wenn Sie die Informationen einfach verketten wollen Sie es tun könnten:

String value = kppSubitleMap.get(kppKey); 
if (value==null){ 
    value = ""; 
} 
value += "NO GBR SUBTITLES"); 
kppSubitleMap.put(kppKey, value); 
+0

Danke. Es hat etwas gedauert, bis es funktionierte. – Burco

+0

Gern geschehen. Es war nicht so lange für jemanden, der das Konzept entdeckt :) – davidxxx

0

Wenn Sie Map.put() mehrmals aufrufen Map enthält nur den letzten Wert für den gleichen Schlüssel. Sie können Map<String, Set<String>> Beispiel verwenden:

Set<String> values = kppSubitleMap.get(kppKey); 
if (values == null) { 
    values = new HashSet<>(); 
    kppSubitleMap.put(kppKey, values); 
} 
values.add("NO GBR SUBTITLES") 

oder Guava.Multimaps

Verwandte Themen