2013-07-06 108 views
1

這樣做最有效的方法是什麼?什麼是最有效的方法來檢查項目是否存在Arraylist?

我有一個名爲windowList的ArrayList列表。

GameWindow是具有startTime和endTime的bean。

對於我收到的每個對象,我需要檢查屬於此windowList值的任何對象的窗口。我需要爲數百萬的價值做到這一點。

請幫我最effeftive方式做到這一點....

+1

您可以爲您收到的物件添加班級代碼,以及您的問題意味着什麼「所屬」? – Tala

+3

最有效的方法是將您的元素放在排序的集合中並執行散列或二分搜索。 –

+0

我編輯了我的答案;我認爲它應該很好地回答你的需要 – fge

回答

1

建議:放下你的ArrayListSortedMap走吧。我們假設這裏有兩件事:

  • 您的開始和結束時間是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()的重要性。
相關問題