沒有指定不多的接口,所以我就定義了一些基礎知識,從中您可以去和開發更多:
與阻塞寬度名單應該能夠添加元素
每個人都應該能夠訪問的任意行列表
你可以繼續並定義一個迭代器,實現各種收集接口和任何你想要的。
請注意,任何客戶端代碼都不應該關注實現細節。仔細考慮一下阻塞寬度的列表界面。界面告訴客戶現在需要的一切。界面如何實施完全是實施課程的關注點。也就是說,您可以輕鬆地將寬度爲二維的列表存儲爲單個簡單的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