gpt4 book ai didi

java - 检查 Arraylist 中是否存在项目的最有效方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:15 25 4
gpt4 key购买 nike

最有效的方法是什么?

我有一个名为 windowList 的 ArrayList 列表。

GameWindow 是具有 startTime 和 endTime 的 bean。

对于我收到的每个对象,我需要检查该对象的窗口是否属于此 windowList 值中的任何一个。我需要为数百万个值执行此操作。

请帮助我以最有效的方式做到这一点......

最佳答案

建议:放弃 ArrayList 并使用 SortedMap。我们在这里假设两件事:

  • 您的开始和结束时间很长(注意:为 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() 非常重要。

关于java - 检查 Arraylist 中是否存在项目的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17502068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com