“阻止”ArrayList大小

时间:2014-09-27 18:15:46

标签: java arrays arraylist

所以,由于这个问题,我有一个 2D ArrayList How to create a Multidimensional ArrayList in Java? 而且,现在我在<2D>数组内 ,感谢这个问题:Convert ArrayList into 2D array containing varying lengths of arrays

我需要我的ArrayList有一个&#34; 被阻止的宽度&#34; (bws),也就是说,当ArrayList的大小达到那个数字(bws)时,它会打破&#34; ArrayList行:

但是,我没有想法如何做到:(。

编辑:

那么,我该怎么办?

1 个答案:

答案 0 :(得分:1)

你没有详细说明界面,所以我只是定义一些基础知识,你可以从中继续开发更多:

  • 宽度被阻止的列表应该能够添加元素

  • 应该能够访问列表中的任意行

您可以继续定义迭代器,实现各种集合接口以及您想要的任何内容。

请注意,任何客户端代码都不应该关注实现细节。仔细考虑列表的界面与被阻止的宽度。界面告诉客户现在需要的一切。如何实现接口仅仅是实现类的关注点。也就是说,您可以轻松地将包含宽度的二维列表存储为单个java.util.List。但是要从客户端隐藏该列表。

这是我建议的代码:

public class BlockedWidthList<T> {

    public static void main(String[] args) {
        BlockedWidthList<Integer> myList = new BlockedWidthList<Integer>(6);
        for(int i = 0; i < 20; i++)
            myList.add(i);
        for(Integer entry : myList.getRow(2))
            System.out.println(entry);
    }

    /** @throws java.lang.IllegalArgumentException if 'blockedWidthSize' is less than or equal to zero */
    public BlockedWidthList(int blockedWidthSize){
        if(blockedWidthSize<1)
            throw new IllegalArgumentException("Width must be a positive number");
        this.blockedWidthSize = blockedWidthSize;
    }

    public final int blockedWidthSize;

    private List<T> internal = new ArrayList<T>();

    public void add(T elem){
        internal.add(elem);
    }

    /** Access a row in the blocked width list by a row index. Indexing starts at 0
      *
      * @return A list containing up to 'blockedWidthSize' elements
      * @throws java.lang.IndexOutOfBoundsException if the row does not exist
      */
    public List<T> getRow(int rowIndex){
        if (rowIndex < 0) throw new IndexOutOfBoundsException("Negative row");
        int startIdx = rowIndex * blockedWidthSize;
        return internal.subList(startIdx, startIdx + blockedWidthSize);
    }
}

你可以看到,在这个类中,这个类只使用一个列表和一个整数。 Add只是将调用转发到基础列表。

您可能感兴趣的方法是getRow。让我们考虑一下在列表中可以找到i行的位置。

  • 第一行始终位于索引0处,因为我们在末尾附加元素。

  • 删除blockWidthSize个元素后,第二行开始。由于我们是0索引,第二行从索引blockWidthSize

  • 开始
  • 如果你考虑一下,i行的第一个元素是索引i * blockWidthSize

然后我们简单地从计算索引开始返回subList,稍后返回blockedWidthSize元素。

编辑:显然,这个界面相当无用:客户端无法知道他是否可以访问某一行,除非他知道列入列表的所有元素,或者他是否抓住了访问无效行时抛出异常。这意味着,您应该在界面中添加一个方法,该方法公开有关列表的大小的信息。这可能只是元素的数量(即转发到internal.size()的调用,或行数(需要一些计算,但不是很难)