Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不影响下一个函数的情况下清除ArrayList?_Java_Arraylist - Fatal编程技术网

Java 如何在不影响下一个函数的情况下清除ArrayList?

Java 如何在不影响下一个函数的情况下清除ArrayList?,java,arraylist,Java,Arraylist,我试图读取一个文件并将其传递给一个名为“Allabaque”的类,该类有一个字符串和两个列表。当我读完第一个ABAQE后,我想清除这两个列表,以便获得nexts值,但如果我清除列表,即使我在添加新ABAQE后这样做,函数也会将带有两个空列表的新ABAQE传递给我。代码如下: public void importFrom(String filename) { try ( FileInputStream fis = new FileInputStream(filena

我试图读取一个文件并将其传递给一个名为“Allabaque”的类,该类有一个字符串和两个列表。当我读完第一个ABAQE后,我想清除这两个列表,以便获得nexts值,但如果我清除列表,即使我在添加新ABAQE后这样做,函数也会将带有两个空列表的新ABAQE传递给我。代码如下:

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");
    }
}
使用调试,我想我已经发现内存有问题,但我真的不知道如何修复它


我也尝试过使用两个中介列表,我把它当作注释,但仍然没有任何效果。

清除
Pression
列表也会清除以前传递给
Abaque
构造函数的列表,因为您将
List
引用传递给构造函数,而不是列表的副本

您可以将新列表传递给构造函数:

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

Couple=newarraylist();
Pression=newarraylist();

后一种方法可能更有效,因为您不必将原始列表的内容复制到新列表,也不必清除任何列表。

或者在
Abaque
@AndyTurner的构造函数中进行防御性复制也可以,但我认为避免复制(传递给构造函数或在构造函数中创建)效率会更高。当然,这只会在列表非常大和/或循环有很多次迭代的情况下产生影响。效率更高,但这会给客户端带来负担,让他们记住传递防御副本。如果在构造函数中基于列表内容建立的任何不变量是客户的责任(假设有任何这样的不变量)。引用布洛赫的话,“你必须进行防御性编程,假设你的类的客户会尽最大努力破坏它的不变量。”。尝试是那样的尝试{而不是那样的尝试(@youcefladani OP正在使用。哦,这是我第一次看到这种尝试(我想知道这一点,谢谢你@Andy Turner你应该具体说明“仍然没有”在这里的确切含义。
addAbaque(new Abaque(Cle,new ArrayList<String>(Pression),new ArrayList<String>(Couple)));
Couple.clear();
Pression.clear();
Couple = new ArrayList<>();
Pression = new ArrayList<>();