2016-07-19 46 views
1

我正在尝试读取文件并将其传递给名为“Allabaque”的类,该类具有一个字符串和两个列表。当我读完第一个不透明的时候,我想清除两个列表,这样我就可以得到下一个值,但是如果我清除了列表,即使我在添加新的abaque后执行它,函数也会将新的abaque与两个空列表。下面是代码:如何清除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方法是简单

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

使用调试我想我已经发现,它与内存中的问题,但我reaaly不知道如何解决它。

我也试过两个中间人名单,我把它像评论一样,但仍然没有。

+0

尝试就是这样**尝试{**不是那样**尝试(** –

+1

@YoucefLaidani OP正在使用[try-with-resources](https://docs.oracle.com/javase/tutorial /essential/exceptions/tryResourceClose.html) –

+0

ooh这是我第一次看到这种**尝试(**我应该了解这一点,谢谢@Andy Turner –

回答

0

清除CouplePression名单也清除先前传递给Abaque构造名单,因为你是路过List引用构造函数,而不是名单的副本。

您可以通过新的列表来构造:

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

或创建不是清除旧的新的列表,如更换

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

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

的后者可能更有效,因为您不必复制原始列表t的内容o新列表,而且您不必清除任何列表。

+0

或者在Abaque的构造函数中使用防御副本 –

+0

@AndyTurner这也可以,但我认为避免副本(或者传递给构造函数或者在构造函数中创建)会更有效率。如果列表非常大并且/或者循环有很多迭代,这只会产生影响。 – Eran

+0

它更高效,但它将放置记住要通过防御性副本的客户负担。如果客户负责(假设有任何这种不变量),那么根据列表内容在构造函数中建立的任何不变量都可以很容易地失效。引用Bloch的话说:“你必须在防守方面进行编程,假设你的班级的客户将尽最大努力摧毁其不变量。” –

相关问题