2014-09-27 63 views
0

所以,我有一个2D ArrayList中感谢这样一个问题:How to create a Multidimensional ArrayList in Java? 而且,现在我把它一个二维数组里面,多亏了这个问题:Convert ArrayList into 2D array containing varying lengths of arrays“块”的ArrayList大小

我需要我ArrayList的具有 “阻塞宽度尺寸”(BWS),即,当该ArrayList的大小达到该数目(BWS),它 “断” 该ArrayList行:

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

编辑:

那么,我该怎么办?

+0

你的问题到底是什么? – NPE 2014-09-27 18:20:06

+0

问题编辑在 – 2014-09-27 18:21:20

+3

我的意思不是粗鲁,但我认为你应该做的是编写一些代码,然后展示给我们,并解释你遇到困难的部分,然后我们将能够帮助你进步 – NPE 2014-09-27 18:22:42

回答

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(),或行数(这需要一些计算,但不是太难)

+0

ArrayList必须是2D:ArrayList > – 2014-09-28 23:27:51

+1

为什么实现细节很重要?如果你愿意,你总是可以在'BlockedWidthList'上定义一个迭代器,并将每个元素存储在'List'中。 – 2014-09-29 10:55:26

+0

哦,你是对的。对于那个很抱歉。 +1 – 2014-09-29 16:05:42