如何使一个子列表引用他原来的ArrayList?

时间:2019-02-08 23:30:59

标签: java arrays arraylist reference

我需要在Java中完成有关ArrayList和泛型类型的作业。

我有2节课: ->双门轿跑车 -> TableauPartiel

CoupeDeA只是一个描述从哪里剪切数组的地方。 (它仅包含两个私有整数变量“ begin”和“ end”)

TableauPartiel是ArrayList所在的类。

我的问题是我需要像这样在TableauPartiel中创建一个方法:

public TableauPartiel<E> coupe(CoupeDeA coupe)

返回的TableauPartiel必须是我的初始TableauPartiel的引用。示例:

Integer[] arr = {8,7,6,5};
TableauPartiel<E> tab = new TableauPartiel<>(arr);

TableauPartiel<E> tab2 = tab.coupe(1,3);
tab2.set(1,45);

该代码应该在我的tab2的索引1处设置45,同时在索引2处设置45。

但是我尝试了许多不同的方法,并且设法获得了子列表,但是它没有指向我的原始ArrayList。

例如,我尝试过这样的事情:

private ArrayList<E> tableau;
...
public TableauPartiel<E> coupe(Coupe coupe)
            throws IndexOutOfBoundsException {
    if (coupe.getBegin() >= 0 && coupe.getEnd() <= tableau.size()) {

        TableauPartiel<E> tab = new TableauPartiel<>((E[]) new Object[coupe.getEnd()-coupe.getBegin()]);

        for (int i = 0; i < coupe.getEnd()-coupe.getBegin(); ++i) {
            tab.set(i, this.get(coupe.getBegin()+i));
        }

        return tab;

    } else {
        throw new IndexOutOfBoundsException();
    }
}

如何获取引用其原始ArrayList的子列表?

我已经找到了使用subList方法并将ArrayList的签名切换为List的代码的解决方案,但是我的老师最终不希望我们使用subList。 这是我的带有subList方法的代码:

TableauPartiel<E> tab;

if (coupe.getDebut() >= 0 && coupe.getFin() <= taille()) {
    if (coupe.getFin() == -1)
        tab = new TableauPartiel<>(tableau.subList(coupe.getDebut(),taille()));
    else
        tab = new TableauPartiel<>(tableau.subList(coupe.getDebut(),coupe.getFin()));

     return tab;
    } else {
    throw new IndexOutOfBoundsException();
    }
}

1 个答案:

答案 0 :(得分:0)

首先要注意几件事:

  • 在代码中坚持英文单词。特别是在类,函数,变量等的名称中-名称必须揭示意图(没有Google Translate)。最好不要让自己去养成不良习惯。
  • 我不确定您的Coupe是如何工作的(0是法定最低电话号码还是1?),但是coupe.getEnd() <= tableau.size()可能会失控< / li>

现在我对解决方案的建议:

我建议您修改TableauPartiel类,使其除了已有start引用之外,还具有endprivate ArrayList<E> tableau;整数字段。也许添加一个新的“副本构造函数”来接受一个实例 TableauPartiel(您可以从中复制对tableau的引用)和两个int值,指示您可以使用原始tableau的哪一部分(此处的技巧还在于查看{您要“列出”对象的{1}}和start值)。这样,当您调用end时,就可以检查输入数字的有效性(就像您已经做的那样),只需返回一个引用了#coupe和方法的新TableauPartiel对象参数-thisstart的值。将endstart的索引操作逻辑添加到end拥有的任何方法中,您应该会做得很好。