2016-07-19 5 views
1

私はファイルを読み込み、それをStringと2つのListを持つ "Allabaque"というクラスに渡そうとしています。私が最初のアバークを読み終えたら、私は2つのリストをクリアして次の値を得ることができますが、リストをクリアすると、新しいアバークを追加しても、関数は2つの新しいアバークを渡します空リスト。ここでは、コードは次のとおりです。次のファンクションに影響を与えずにArrayListをクリアするには?

public void importFrom(String filename) { 
    try (
      FileInputStream fis = new FileInputStream(filename); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(fis));) { 
     String line; 
     String line2; 
     int c = 0; 
     List<String> Pression = new ArrayList<>(); 
     List<String> Couple = new ArrayList<>(); 
     List<String> P2 = new ArrayList<>(); 
     List<String> C2 = new ArrayList<>(); 
     String Cle = "null"; 

     while ((line = reader.readLine()) != null) { 

      if (c == 2 && !"|".equals(line)) { 

       String[] arg = line.split("-"); 
       boolean u = Pression.add(arg[0]); 
       boolean u2 = Couple.add(arg[1]); 
      } 
      if (c == 1) { 
       Cle = line; 
       c = 2; 
       //System.out.printf("%s",Cle); 
      } 
      if ("|".equals(line)) { 
       c = 1; 
       if (!"null".equals(Cle)) { 
        //P2 = Pression; 
        //C2 = Couple; 
        addAbaque(new Abaque(Cle, Pression, Couple));//addAbaque(new Abaque(Cle,P2,C2)); 
        Couple.clear(); 
        Pression.clear(); 
       } 
      } 
     } 
    } catch (IOException ioe) { 
     System.out.printf("Erreur import"); 
    } 
} 

addAbaque方法は、私はそれがメモリに問題があるのですが、私はreaalyそれを修正する方法を知ってはいけないことを発見したと思うのデバッグを使用したシンプルな

public void addAbaque(Abaque abaque) { 
    mAbaques.add(abaque);`` 
} 

です。

私は2つのintermedieries Listで試してみましたが、私はコメントのようにそれを打ちましたが、まだ何もありません。あなたは、コンストラクタにListの参照を渡すリストのコピーではなくされているのでCouplePressionリストをクリア

+0

試してみてください** **試してみてください** **試してみてください(** –

+1

@YoucefLaidani OPは[try-with-resources]を使用しています(https://docs.oracle.com/javase/tutorial /essential/exceptions/tryResourceClose.html)。 –

+0

私はこの種の**試してみるのは初めてですよ(**私はそれについて学ぶべきです、@Andy Turnerに感謝します –

答えて

0

も、以前Abaqueコンストラクタに渡されたリストをクリアします。

あなたはコンストラクタに新しいリストを渡すことができ、次のいずれか

addAbaque(new Abaque(Cle,new ArrayList<String>(Pression),new ArrayList<String>(Couple))); 

またはその代わりに古いものをクリアする新しいリストを作成し、すなわち

Couple = new ArrayList<>(); 
Pression = new ArrayList<>(); 

Couple.clear(); 
Pression.clear(); 

を置き換えます元のリストの内容をコピーする必要がないので、おそらく後者の方が効率的です新しいリストがあり、リストを消去する必要はありません。

+0

また、 'Abaque'のコンストラクタで防衛的なコピーを取ることもできます。 –

+0

@AndyTurnerそれもうまくいくでしょうが、コピーを避ける(コンストラクタに渡されるかコンストラクタ内で作成される)の方が効率的です。これは、リストが非常に大きく、ループの繰り返し回数が多い場合にのみ効果があります。 – Eran

+0

より効率的ですが、防衛的なコピーを渡すことを忘れないようにクライアントに負担を与えます。リストの内容に基づいてコンストラクタに設定された不変条件は、クライアントの責任であれば無効にすることができます(そのような不変条件があると仮定します)。ブロッホの言葉を引用すると、あなたのクラスのクライアント がその不変物を破壊するために最善を尽くすという前提で、防衛的にプログラムしなければなりません。 " –

関連する問題