无法在方法中显示arrayList元素

时间:2018-04-03 15:54:44

标签: java arraylist

我有以下代码: 这是一个用于存储每月费用摘要的类。 voci是一个用于存储费用(名称和费用)的arraylist。 mese是摘要的月份,anno是摘要的年份。我的问题是,当我调用showRiepilogo()方法时,我必须看到那个月的费用清单,但我什么都看不到。有人可以告诉我为什么好吗?

RiepilogoMensile课程扩展了Riepilogo {

private ArrayList<Voce> voci = new ArrayList<Voce>();
private int mese;
private int anno;

public RiepilogoMensile(int mese, int anno, String autore, ArrayList<Voce> voci) {
    super(autore);
    this.mese = mese;
    this.anno = anno;

    // il blocco successivo è necessario???in teoria il costruttore viene invocato solo una volta.. bisogna cambiare solo la set e la get?.. provo!

    // aggiunta delle voci
    boolean voceExist = false;

    // variabile temporanea che contiene gli anni da aggiungere
    ArrayList<Voce> oldVoci = new ArrayList<Voce>();
    oldVoci.addAll(this.voci);

    ArrayList<Voce> newVoci = new ArrayList<Voce>();
    newVoci.addAll(voci);

    // controllo se le voci da aggiungere sono già presenti
    for (Voce a : oldVoci) {
        voceExist = false;
        for (int i = 0; i < newVoci.size(); i++) {
            if (a.equals(newVoci.get(i))) {
                voceExist = true;
                break;  
            }
        }
        if (!voceExist)
            voci.add(a);
    }

    // test costruttore
    System.out.println("Test costruttore voci--> INIZIO");
    for(Voce v:voci)
        System.out.println(v.getNome()+" "+v.getSpesa());
    System.out.println("Test costruttore voci--> FINE");
}

public ArrayList<Voce> getVoci() {
    ArrayList<Voce> temp = new ArrayList<Voce>();
    temp.addAll(this.voci);
    return (temp);
}

public void setVoci(ArrayList<Voce> voci) {
    // aggiunta delle voci
    boolean voceExist = false;

    // variabile temporanea che contiene gli anni da aggiungere
    ArrayList<Voce> oldVoci = new ArrayList<Voce>();
    oldVoci.addAll(this.voci);

    ArrayList<Voce> newVoci = new ArrayList<Voce>();
    newVoci.addAll(voci);

    // controllo se le voci da aggiungere sono già presenti
    for (Voce a : oldVoci) {
        voceExist = false;
        for (int i = 0; i < newVoci.size(); i++) {
            if (a.equals(newVoci.get(i))) {
                voceExist = true;
                break;  
            }
        }
        if (!voceExist)
            this.voci.add(a);
    }
}

@Override
public void showRiepilogo() {
    String messaggio = "\nRiepilogo del " + anno + " di " + Voce.intToString(mese) + " creato da " + getAutore()
            + ": ";
    System.out.println(messaggio);
    utils.showRow(messaggio.length() - 2, '-'); // tolgo 2 perchè non devo considerare \n
    System.out.println();

    System.out.println("Test stampa voci in showRiepilogo() voci--> INIZIO");
    // stampa voci
    for (Voce v : voci)
        System.out.println(v.getNome() + " " + v.getSpesa() + " EURO " + (v.getSpesa() > 0 ? "<--ENTRATA" : "USCITA-->"));

    for(int i=0;i<voci.size();i++) {
        System.out.println(voci.get(i).getNome() + " " + voci.get(i).getSpesa() + " EURO " + (voci.get(i).getSpesa() > 0 ? "<--ENTRATA" : "USCITA-->"));
    }

    System.out.println("Test stampa voci in showRiepilogo() voci--> FINE");

}

}

当我从main调用showRiepilogo()时,我看不到任何内容,而是可以看到voci ArrayList的内容。

riepiloghiMensili.get(指数).showRiepilogo();

有人知道为什么吗?

感谢Elias的建议。

2 个答案:

答案 0 :(得分:0)

你有一个非常奇怪的构造函数,你试图遍历成员this.voci但是因为你在构造函数中执行此操作this.voci将始终是一个空数组。看看宣言:

private ArrayList<Voce> voci = new ArrayList<Voce>();

你的setVoci(...)方法会因同样的原因失败,this.voci为空,永远不会输入for循环,也没有对象添加到数组中。

将构造函数更改为仅将数组设置为给定参数

this.voci = voci

我还建议对setVoci方法执行相同操作或重命名它,因为set ...方法应该将成员设置为给定参数。

答案 1 :(得分:0)

我已经尝试了ArrayList的引用,但它并不能正常工作!按照你所说的做,将相同的ArrayList分配给RiepilogoMensile的所有istances。

我已经做到了,一切正常:

RiepilogoMensile课程扩展了Riepilogo {

private ArrayList<Voce> voci = new ArrayList<Voce>();
private int mese;
private int anno;

public RiepilogoMensile(int mese, int anno, String autore, ArrayList<Voce> voci) {
    super(autore);
    this.mese = mese;
    this.anno = anno;
    this.voci.addAll(voci);
}

public ArrayList<Voce> getVoci() {
    ArrayList<Voce> temp = new ArrayList<Voce>();
    temp.addAll(this.voci);
    return (temp);
}

public void setVoci(ArrayList<Voce> voci) {
    this.voci.addAll(voci);
    // aggiunta delle voci
    boolean voceExist = false;

    // variabile temporanea che contiene gli anni da aggiungere
    ArrayList<Voce> oldVoci = new ArrayList<Voce>();
    oldVoci.addAll(this.voci);

    ArrayList<Voce> newVoci = new ArrayList<Voce>();
    newVoci.addAll(voci);

    // controllo se le voci da aggiungere sono già presenti
    for (Voce a : oldVoci) {
        voceExist = false;
        for (int i = 0; i < newVoci.size(); i++) {
            if (a.equals(newVoci.get(i))) {
                voceExist = true;
                break;  
            }
        }
        if (!voceExist)
            this.voci.add(a);
    }
}

谢谢你的注意! 再见,伊莱亚斯。