2012-08-23 176 views
53

我有一個顯示Glassfish日誌文件列表的JSF頁面。我使用懶加載分頁。我將日誌文件名列表保存爲Java List如何使用subList()

private List<directoryListObj> dataList = new ArrayList<>(); 

dataList = dataList.subList(firstRow, lastRow); 

這就是問題所在。例如,我有35個文件進入目錄。當我這樣做

dataList = dataList.subList(5, 15); 

它工作正常。但當我這樣做:

dataList = dataList.subList(30, 38); 

我得到錯誤錯誤的索引,因爲我想索引列表之外。我如何可以例如返回列表元素從30到35?我想如果我想索引從30到40,但如果只有35索引得到只有5.

+9

'數據列表= dataList.subList(30,38> dataList.size()dataList.size():38);' – pb2q

+11

或'dataList.subList(30,數學。分鐘(38,dataList.size())' –

+1

@ pb2q看起來像你已經失去了答案的機會 –

回答

59

使用subList(30, 38);將失敗,因爲最大索引38不在列表中,所以它不可能。

只有在詢問子列表之前,您可以使用list size()方法明確確定最大索引。

例如,檢查大小,它返回35,所以叫sublist(30, size());

OR

複製了pb2q評論

dataList = dataList.subList(30, 38 > dataList.size() ? dataList.size() : 38); 
+0

@PaulBellora:你是對的。編輯答案。 – kosa

+0

謝謝大家! – user1285928

+4

如果列表的內容少了,也會失敗超過30件。 –

37

要獲得最後一個元素,只需使用的大小該列表作爲第二個參數。因此,舉例來說,如果你有35個文件,並希望過去的五年,你會怎麼做:

dataList.subList(30, 35); 

一個保證安全的方式來做到這一點是:

dataList.subList(Math.max(0, first), Math.min(dataList.size(), last)); 
+3

如果'first'大於列表大小,那也會失敗。 –

+3

@Haroldo_OK:或者'last'是否定的! –

+0

如果'first> = last'也會失敗 – augurar

28

我已經實現並測試這個;它應該覆蓋大多數鹼:

public static <T> List<T> safeSubList(List<T> list, int fromIndex, int toIndex) { 
    int size = list.size(); 
    if (fromIndex >= size || toIndex <= 0 || fromIndex >= toIndex) { 
     return Collections.emptyList(); 
    } 

    fromIndex = Math.max(0, fromIndex); 
    toIndex = Math.min(size, toIndex); 

    return list.subList(fromIndex, toIndex); 
} 
+2

這應該是被接受的答案,唯一一個懶得去測試他們的代碼的人。 –

+1

謝謝,可惜這不是'陣列'的一部分... –

+1

非常有幫助,謝謝。將它分解成一個方法比試圖在三元運算符中包裝邏輯更有意義,但這樣讀取太難了。 – Steve