在排序的ArrayList中查找项的最快方法

时间:2015-11-11 12:33:13

标签: java

在Java中,我有一个带有对象列表的ArrayList。每个对象都有一个日期字段,它只是一个长数据类型。 ArrayList按日期字段排序。我想在ArrayList中插入一个新对象,使其在日期方面显示在正确的位置。我能看到的唯一解决方案是遍历所有项目并将正在插入的对象的日期字段与正在迭代的对象进行比较,然后在到达正确位置时插入它。如果我必须插入大量记录,这将是一个性能问题。

有哪些方法可以改善这种表现?也许ArrayList不是最好的解决方案?

4 个答案:

答案 0 :(得分:3)

我会说你说的是正确的:

  

可能ArrayList不是最佳解决方案

就个人而言,我认为树形结构更适合这种情况。特别是二进制搜索树,它按对象的日期时间排序。创建树后,可以使用二进制搜索,这将花费 O(log n)时间。

答案 1 :(得分:1)

二元搜索+ O(n)插入是否对你不利取决于至少这些:

  • 列表的大小,
  • 访问模式(主要是插入或主要是读取),
  • 空间考虑因素(ArrayList比其他选择要紧凑得多)。

鉴于这些因素的存在及其相当复杂的交互,您不应切换到基于二叉搜索树的解决方案,直到您通过测量找出当前设计的糟糕程度。这种转变甚至可能会让事情变得更糟。

答案 2 :(得分:0)

我会考虑使用use Class::Method::Modifier; # or Moose/Moo around date => sub {...}; 并制作您的商品TreeSet。然后你可以开箱即用。

如果无法做到这一点,我会通过Comparable搜索索引。

编辑:在开始优化之前确保性能是一个问题

答案 3 :(得分:0)

首先,您应该使用以下方式对ArrayList进行排序:

ArrayList<Integer> arr = new ArrayList<>();
...
Collections.sort(arr);

那么你的答案是:

int index = Collections.binarySearch(arr , 5);