没有指定不多的接口,所以我就定义了一些基础知识,从中您可以去和开发更多:
与阻塞宽度名单应该能够添加元素
每个人都应该能够访问的任意行列表
你可以继续并定义一个迭代器,实现各种收集接口和任何你想要的。
请注意,任何客户端代码都不应该关注实现细节。仔细考虑一下阻塞宽度的列表界面。界面告诉客户现在需要的一切。界面如何实施完全是实施课程的关注点。也就是说,您可以轻松地将宽度为二维的列表存储为单个简单的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
行。
然后,我们简单地返回subList
开始计算的指数和blockedWidthSize
后来的元素结束。
编辑:很显然,这个接口是相当无用的:一个客户端无法知道,除非他或者知道被放进列表中的所有元素,他是否可以访问某行,或访问时,如果他抓住抛出的异常一个无效的行。这意味着,至少应该在接口中添加一个方法,以公开有关列表的大小的信息。这可能只是元素的数量(即转发呼叫到internal.size()
,或行数(这需要一些计算,但不是太难)
你的问题到底是什么? – NPE 2014-09-27 18:20:06
问题编辑在 – 2014-09-27 18:21:20
我的意思不是粗鲁,但我认为你应该做的是编写一些代码,然后展示给我们,并解释你遇到困难的部分,然后我们将能够帮助你进步 – NPE 2014-09-27 18:22:42