如果我从另一个类调用它,为啥我的 ArrayList 是空的?

Posted

技术标签:

【中文标题】如果我从另一个类调用它,为啥我的 ArrayList 是空的?【英文标题】:Why Am I getting my ArrayList empty if I call it from another class?如果我从另一个类调用它,为什么我的 ArrayList 是空的? 【发布时间】:2016-05-08 08:57:22 【问题描述】:

我是 Java 新手,非常感谢您的帮助。

关于我的代码的注意事项

我有两节课。

    第一类称为 EvidenceBox.class 第二类称为 Police.class

在 EvidenceBox 类中,我有一个名为 getParticularEvidence() 的方法

    public ArrayList <Evidence> getParticularEvidence(int caseNumber, String evidenceType) 
      EvidenceBox e = new EvidenceBox(caseNumber, evidenceType);
      return e.getEvidenceByType(caseNumber, evidenceType);
    

这个方法所做的就是将 caseNumber 和 evidenceType 作为参数。在此方法中,我们创建了 EvidenceBox 类的 Object 实例,以便我可以调用 EvidenceBox 类中的另一个名为 getEvidenceByType() 的方法。这个方法的重点是把上面的这两个参数传递给另一个类中的另一个方法,该方法在 for 循环中有一个 if 语句,用于检查参数是否等于 ArrayList 中称为evidenceBoxList 的东西,如果相等,则返回相等的证据列表。

当我在 Main 类中调用它时:

System.out.println(crimeBoxOne.getEvidenceByType(2005000381, "S.Avery"));

它的作用是转到 getEvidenceByType 方法,然后调用 Evidence 类中的另一个方法:

    public ArrayList < Evidence > getEvidenceByType(int keyNumber, String keyName) 
      ArrayList < Evidence > setOfEvidence = new ArrayList < > (evidenceBoxList);
      for (Evidence e: setOfEvidence) 
        if (this.getCaseNumber() == keyNumber) 
          if (this.getCaseName().equals(keyName)) 
            System.out.println("Pieces of DNA Evidence in Evidence Box number " + this.getCaseNumber() + " found by " + this.getCaseName() + ": " + this.getEvidence());
            getEvidence().add(e);
           else 
            System.out.println("Not found!");
          
         else 
          System.out.println("Not Found!");
        
      
      return getEvidence();
    

getCaseNumber为EvidenceBox的编号,getCaseName为evidenceBox的名称

我的问题

我的问题是列表的返回总是空的,即使它不是因为我将 EvidenceBox 添加到了 ArrayList。我该如何解决这个问题?

getEvidence() 是返回evidenceBox 列表的getter 方法。

这是我的 EvidenceBox 课程:

package looselycoupled;

import java.util.*;

public class EvidenceBox 
  private int caseNumber;
  private String caseName;
  private ArrayList evidenceBoxList;

  public EvidenceBox(int caseNumber, String caseName) 
    this.evidenceBoxList = new ArrayList < Evidence > ();
    this.caseNumber = caseNumber;
    this.caseName = caseName;
  

  public ArrayList < Evidence > getEvidenceByType(int keyNumber, String keyName) 
    ArrayList < Evidence > setOfEvidence = new ArrayList < > (evidenceBoxList);
    for (Evidence e: setOfEvidence) 
      if (this.getCaseNumber() == keyNumber) 
        if (this.getCaseName().equals(keyName)) 
          System.out.println("Pieces of DNA Evidence in Evidence Box number " + this.getCaseNumber() + " found by " + this.getCaseName() + ": " + this.getEvidence());
          getEvidence().add(e);
         else 
          System.out.println("Not found!");
        
       else 
        System.out.println("Not Found!");
      
    
    return getEvidence();
  

  public void add(Evidence getTypeFromEvidenceClass) 
    evidenceBoxList.add(getTypeFromEvidenceClass);
  


  public ArrayList < Evidence > getEvidence() 
    return evidenceBoxList;
  



  public void printRecordsOfTheEvidence() 
    Set < Evidence > setOfEvidence = new HashSet < > (evidenceBoxList);
    for (Evidence e: setOfEvidence) 
      System.out.println(Collections.frequency(evidenceBoxList, e) + "x " + e);
    
  

  public int getCaseNumber() 
    return caseNumber;
  

  public String getCaseName() 
    return caseName;
  

  @
  Override
  public String toString() 
    return caseNumber + " " + caseName;
  

和警察课:

package looselycoupled;

import java.util.ArrayList;

public class Cop 
    private String name;
    //private ArrayList collectionOfEvidences = new ArrayList<>();
    private ArrayList<EvidenceBox> collectionOfEvidences = new ArrayList<>();
    public Cop(String name) 
        this.name = name;
    

    public void copTakesAnEvidenceBox(EvidenceBox box) 
        collectionOfEvidences.add(box);
    

    public ArrayList<Evidence> getParticularEvidence(int caseNumber, String evidenceType) 
        EvidenceBox e = new EvidenceBox(caseNumber, evidenceType);
        return e.getEvidenceByType(caseNumber, evidenceType);
    

    public ArrayList<EvidenceBox> getEvidence() 
        return collectionOfEvidences;
    

    public String toString() 
        return name;
    

【问题讨论】:

请发getEvidence()的代码。您的代码的问题之一是 if conditionsif (this.getCaseNumber() == keyNumber)if (this.getCaseName().equals(keyName)) 始终为真,因为您正在比较设置给对象并传递给函数的相同值。你不应该改用e.getCaseNumber()e.getCaseName() 吗? 这是 getEvidence(): public ArrayList getEvidence() return evidenceBoxList; 你在哪里/如何向evidenceBoxList添加元素? 这是添加方法:@user140547 ` public void add(Evidence getTypeFromEvidenceClass) evidenceBoxList.add(getTypeFromEvidenceClass); ` 您正在迭代setOfEvidence 列表。但是如果这个列表是空的,我猜它最初是空的,则永远不会调用 add() 方法。 【参考方案1】:

evidenceBoxListEvidenceBox 类的私有。

每当您在执行 EvidenceBox e = new EvidenceBox(caseNumber, evidenceType); 时,它都会创建此列表的一个新的空白实例,没有任何值。

接下来,您将迭代此列表并尝试使用以下代码添加一个值:

ArrayList < Evidence > setOfEvidence = new ArrayList < > (evidenceBoxList);
    for (Evidence e: setOfEvidence) 
      if (this.getCaseNumber() == keyNumber) 
        if (this.getCaseName().equals(keyName)) 
          System.out.println("Pieces of DNA Evidence in Evidence Box number " + this.getCaseNumber() + " found by " + this.getCaseName() + ": " + this.getEvidence());
          getEvidence().add(e);
         else 
          System.out.println("Not found!");
        
       else 
        System.out.println("Not Found!");
      
    
    return getEvidence();
  

现在,由于您最初在 evidenceBoxList 中没有元素,因此它永远不会进入 for 循环,也永远不会调用 add() 方法。

getEvidence() 方法然后将这个空白列表返回给您。

在for循环前加getEvidence().add(new Evidence(keyNumber,keyName));,验证问题。

ArrayList < Evidence > setOfEvidence = new ArrayList < > (evidenceBoxList);
    /* Add Here */
    getEvidence().add(new Evidence(keyNumber,keyName));
    for (Evidence e: setOfEvidence) 
        /* Rest of the code */

现在,它应该返回一个包含一个对象的列表。

【讨论】:

感谢您的解释,我尝试了您要求我做的事情。但是,现在它只返回我添加的证据getEvidence().add(new Evidence(keyNumber,keyName)); 我想添加的任意数量的证据呢? 我刚刚解释了这个问题。您需要修改代码以实现您想要实现的目标。可能尝试将evidenceListBox 设为全局。 啊,非常感谢。我非常感谢您的回复。你赢了

以上是关于如果我从另一个类调用它,为啥我的 ArrayList 是空的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 kivy 程序没有从另一个类调用函数?

为啥我的 java 函数没有从另一个类的输出调用?

如果我想从另一个片段中添加书签,为啥我的书签单词没有保存到 sqlite 数据库?

当我从另一个类调用数组时,数组不会更新

当我从另一个窗体调用一个窗口时,它显示两个窗口一个在另一个的顶部

当我从另一个调用接口方法时,Spring Boot(Java)中出现以下错误