1
這樣做最有效的方法是什麼?什麼是最有效的方法來檢查項目是否存在Arraylist?
我有一個名爲windowList的ArrayList列表。
GameWindow是具有startTime和endTime的bean。
對於我收到的每個對象,我需要檢查屬於此windowList值的任何對象的窗口。我需要爲數百萬的價值做到這一點。
請幫我最effeftive方式做到這一點....
這樣做最有效的方法是什麼?什麼是最有效的方法來檢查項目是否存在Arraylist?
我有一個名爲windowList的ArrayList列表。
GameWindow是具有startTime和endTime的bean。
對於我收到的每個對象,我需要檢查屬於此windowList值的任何對象的窗口。我需要爲數百萬的價值做到這一點。
請幫我最effeftive方式做到這一點....
建議:放下你的ArrayList
與SortedMap
走吧。我們假設這裏有兩件事:
long
(注意:爲Java 7編寫的代碼);GameWindow
類正確實施.equals()
和.hashCode()
。鑑於這些先決條件,編寫專用的類(比方說,GameWindowList
或某事),其中聲明:
final SortedMap<Long, List<GameWindow>> startTimes = new TreeMap<>();
final SortedMap<Long, List<GameWindow>> endTimes = new TreeMap<>();
添加窗口則是:
public void addGameWindow(final GameWindow window)
{
final long startTime = window.startTime();
final long endTime = window.endTime();
List<GameWindow> list;
// Insert in start times
list = startTimes.get(startTime);
if (list == null) {
list = new ArrayList<>();
startTimes.put(startTime, list);
}
list.add(window);
// Insert in end times
list = endTimes.get(endTime);
if (list == null) {
list = new ArrayList<>();
endTimes.put(endTime, list);
}
list.add(window);
}
展望窗戶給定的時間是:
public List<GameWindow> getWindowsForTime(final long time)
{
// Submap of start times where the time is lower than or equal to
// the requested time
final SortedMap<Long, List<GameWindow>> validStartTimes
= startTimes.headMap(time);
// Submap of end times where the time is greater than or equal to
// the requested time
final SortedMap<Long, List<GameWindow>> validEndTimes
= endTimes.tailMap(time);
// Why GameWindow must implement equals and hashCode
final Set<GameWindow> startSet = new HashSet<>();
final Set<GameWindow> endSet = new HashSet<>();
// Insert into the start set all game windows whose start time
// is less than or equal to the requested time
for (final List<GameWindow> list: startTimes.headMap(time).values())
startSet.addAll(list);
// Insert into the end set all game windows whose end time
// is greater than or equal to the requested time
for (final List<GameWindow> list: endTimes.tailMap(time).values())
endSet.addAll(list);
// Only retain the intersection of both sets
startSet.retainAll(endSet);
// Return the result
return new ArrayList<>(startSet);
}
的兩個關鍵要素是:
SortedMap
的.{tail,end}Map()
過濾掉立即所有窗口,其開始或結束時間是不合法的;HashSet
用於僅保留開始時間和結束時間都合法的窗口交集;因此GameWindow
實施hashCode()
和equals()
的重要性。
您可以爲您收到的物件添加班級代碼,以及您的問題意味着什麼「所屬」? – Tala
最有效的方法是將您的元素放在排序的集合中並執行散列或二分搜索。 –
我編輯了我的答案;我認爲它應該很好地回答你的需要 – fge