2017-01-10 10 views
2

私はこのコードを持っています。 Whisはexcel csvを検索し、ムービー用の字幕がない.txtファイルを作成しています。 1つの映画は1つまたは2つまたは3つまたは4つの字幕を持つことができます。それはすべての言語に対してYまたはNとして書かれています。それは1つの言語(インド語)のために働いています。私は他の言語(GBR、SIM、MYS)をExcelとここに追加しました。メソッドがJavaでオーバーライドするのを防ぐ方法

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

これはどのように適用する必要がありますか?なぜなら、kppKey = tmp [KPPNAME]が存在すればそれをチェックする必要があるからです。存在する場合は、新しい値で上書きせずに新しい値を追加します。そして、私はString **のためにfinalを使うことができるとは思わない**最終的に使用するための誰かの提案に対する返信だった** – Burco

+0

おそらく混乱していて、 '上書き'と '上書き'の違いがあります後者。 –

答えて

3

を使用する:あなたはMap<String, Set<String>> 例を使用することができます。あなたがキーに関連付けられた値を上書きし

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); 
+0

ありがとうございます。それを働かせるには時間がかかりました。 – Burco

+0

ようこそ。それは概念を発見する誰かのためにそれほど長くはなかった:) – davidxxx

0

Map.put()を何回か呼び出すと、マップには同じキーの最後の値が含まれます。

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

またはそれがオーバーライドするメソッドとは関係ありませんGuava.Multimaps