2014-09-27 89 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