所以,由于这个问题,我有一个 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行:
但是,我没有想法如何做到:(。
编辑:
那么,我该怎么办?
答案 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()
的调用,或行数(需要一些计算,但不是很难)