2016-07-19 11 views
1

Ich versuche eine Datei zu lesen und sie an eine Klasse namens "Allabaque" zu übergeben, die einen String und zwei Listen hat. Wenn ich mit dem Lesen des ersten Abaques fertig bin, möchte ich die beiden Listen löschen, damit ich die Werte für die Texte erhalten kann. Wenn ich die Liste lösche, übergebe ich die neue Abaque mit den beiden leere Listen. Hier ist der Code:Wie lösche ich eine ArrayList, ohne die nächste Funktion zu beeinflussen?

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

Die addAbaque Methode ist die einfache

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

Mit dem Debug Ich glaube, ich habe festgestellt, dass es ein Problem mit dem Gedächtnis, aber ich reaaly weiß nicht, wie es zu beheben.

Ich habe auch mit zwei Zwischenmitteilungen versucht, ich putte es wie Kommentare, aber immer noch nichts.

+0

der Versuch ist wie das ** try {** nicht so das ** try (** –

+1

@ YoucefLaidani OP verwendet [versuchen-mit-Ressourcen] (https://docs.oracle.com/javase/tutorial /essential/exceptions/tryResourceClose.html) –

+0

ooh das ist das erste Mal, dass ich diese Art von ** try (** ich sollte darüber lernen, danke @Andy Turner –

Antwort

0

Löschen der Couple und Pression Listen löscht auch die Listen zuvor an den Abaque Konstruktor übergeben, da Sie List Referenzen an den Konstruktor sind vorbei, keine Kopien der Listen.

Sie können entweder neue Listen an den Konstruktor:

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

oder neue Listen erstellen, anstatt die alten von Clearing, dh

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

mit

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

Die letztere Alternative ist wahrscheinlich effizienter, da Sie den Inhalt der ursprünglichen Listen t nicht kopieren müssen o neue Listen, und Sie müssen keine Listen löschen.

+0

Oder nehmen Sie defensive Kopien im Konstruktor von 'Abaque' –

+0

@AndyTurner Das würde auch funktionieren, aber ich denke, die Vermeidung von Kopien (entweder an den Konstruktor übergeben oder im Konstruktor erstellt) wäre effizienter dies würde nur einen Unterschied machen, wenn die Listen sehr groß sind und/oder die Schleife viele Iterationen hat – Eran

+0

es ist effizienter, aber es stellt die Last auf den Client zu erinnern, eine defensive Kopie zu übergeben. Alle Invarianten, die basierend auf dem Inhalt der Liste im Konstruktor festgelegt werden, können leicht ungültig gemacht werden, wenn der Client dafür verantwortlich ist (vorausgesetzt, es gibt solche Invarianten). Um Bloch zu zitieren: "Sie müssen defensiv programmieren, mit der Annahme, dass Clients Ihrer Klasse ihr Bestes tun werden, um ihre Invarianten zu zerstören." –