2017-02-12 13 views
-2

pnValue.clear();のためにこのコードを書きました。私が得ていた出力はキーのためのヌル値でした。そこであるマップの値をもう一方のマップに追加することは、元のマップへの単なる参照であり、clone()メソッドを使用して2つのマップが別々であることを保証する必要があります。今私のマップをクローンした後に直面している問題は、特定のキーに複数の値があると、それらが上書きされているということです。例えば。LinkedHashMapの値が上書きされるベクトル

{PERSON = [James Fisher],ORGANIZATION=[American League, Chicago Bulls]} 

しかし、私が取得することである:私はgoldSentenceを処理することから期待していた出力があり、私は間違っている、私はVector<String>

としての私の値を宣言しています考えるつもりですどこかしら

{PERSON = [James Fisher],ORGANIZATION=[Chicago Bulls]} 

for(WSDSentence goldSentence : goldSentences) 
       { 
        for (WSDElement word : goldSentence.getWsdElements()){ 
         if (word.getPN()!=null){ 
          if (word.getPN().equals("group")){ 
           String newPNTag = word.getPN().replace("group", "organization"); 
           pnValue.add(word.getToken().replaceAll("_", " ")); 
           newPNValue = (Vector<String>) pnValue.clone(); 
           annotationMap.put(newPNTag.toUpperCase(),newPNValue); 

          } 


          else{ 

           pnValue.add(word.getToken().replaceAll("_", " ")); 
           newPNValue = (Vector<String>) pnValue.clone(); 
           annotationMap.put(word.getPN().toUpperCase(),newPNValue); 

          } 

         } 

         sentenceAnnotationMap = (LinkedHashMap<String, Vector<String>>) annotationMap.clone(); 
         pnValue.clear(); 
        } 

改変コード ベクターをリストに置き換え、クローンを除去した。しかし、これはまだ私の問題を解決しません。 {PERSON=[], ORGANIZATION=[]}

for(WSDSentence goldSentence : goldSentences) 
     { 
      for (WSDElement word : goldSentence.getWsdElements()){ 
       if (word.getPN()!=null){ 
        if (word.getPN().equals("group")){ 
         String newPNTag = word.getPN().replace("group", "organization"); 
         pnValue.add(word.getToken().replaceAll("_", " ")); 
         newPNValue = (List<String>) pnValue; 
         annotationMap.put(newPNTag.toUpperCase(),newPNValue); 

        } 


        else{ 

         pnValue.add(word.getToken().replaceAll("_", " ")); 
         newPNValue = pnValue; 
         annotationMap.put(word.getPN().toUpperCase(),newPNValue); 

        } 

       } 

       sentenceAnnotationMap = annotationMap; 

      } 
      pnValue.clear(); 
+0

) '。そこには1つ以上のアイテムがありません。 – shmosel

+0

なぜVectorを変更するためにクローンを作成するのですか?変更する前にコピーを取るのが普通です。それはおそらく無意味です。また、1997年以降のコレクションを使用することをお勧めします。配列リスト。 –

+0

私はpnValue.clear()を呼び出さないと、{PERSON = [James Fisher、American League、Chicago Bulls]、ORGANIZATION = [James Fisher、American League、Chicago Bulls]} – serendipity

答えて

0

あなたは本当にその背後にあるロジックを通して考えずに原料の束をしようとしている:これは戻って私の出力が振り出しに私を取ります。クリアしたり、何かを複製する必要はなく、別々のキーのために別々のリストを管理するだけで済みます。 、マップは、私たちのキーが含まれている場合は、リストを取得し、それ以外の場合は、当社の価値

  • を追加

    • 新しいリストを作成、私たちの価値を追加し、マップにリストを追加します。ここではそれぞれの新しい値のための基本的なプロセスです

    あなたは変数宣言のほとんどを残してきたので、私はあなたの厳密解を表示しようとはしませんが、ここで一般式です:あなたは `pnValue.clearを(呼び出しておく

    List<String> list = map.get(key); // try to get the list 
    if (list == null) {    // list doesn't exist? 
        list = new ArrayList<>();  // create an empty list 
        map.put(key, list);   // insert it into the map 
    } 
    list.add(value);     // update the list 
    
  • 関連する問題