删除arraylist中的相交值

时间:2014-07-21 17:05:42

标签: java algorithm

我有一个这样的课程

    public class Func {
    String id;
    long startTime;
    long endTime;
}

并在其中一个方法中列出了这些类对象

List<Func> funList = new ArrayList<Func>();

从这个funList中删除对象的最佳方法是startTime和endTime与同一列表中的另一个对象相交。

我能想到的一种方法是将列表中的每个对象与其他对象进行比较,并将id放在其他数据结构中(如果它相交)。在将每个对象与其他对象进行比较后,浏览保存ID的数据结构并将其从列表中删除。

3 个答案:

答案 0 :(得分:1)

  1. 按startTime递减,endTime acsending排序。
  2. 从左到右保持元件扫描阵列,当前最大右端/
    1. 如果新项目的左端小于当前最大值,则将两者标记为删除。
    2. 根据需要更新最大权利。
  3. 复杂性:O(n ln n)

    编辑示例

    1. (1,3)(2,4)(5,6)
    2. curmax = -inf
    3. curmax = 3
    4. 2&lt; 3 - 将第一和第二标记为&#34; bad&#34;。 curmax = 4
    5. 5&gt; 4 - 什么都不做。 curmax = 6。
    6. (5,6) - 是唯一的好片段。

答案 1 :(得分:1)

如果您的funList很小,您可以在O(n*n)时间内将每个项目与其他项目进行比较,检查重叠。对于每对项ab,如果a.startTime < b.endTime && b.startTime < a.endTime,它们会重叠。

否则,对于许多项目,您需要O(nlg(n))算法。 kilotaras的答案有效,但实施它可能很棘手;您可能希望Func扩展Comparable并定义compareTo函数以使排序更容易并使代码更清晰。

答案 2 :(得分:0)

// Use a Set so that its elements are distinct.
Set<Func> funcsToRemove = new HashSet<Func>();
for (Func f1 : funList)
{
    for (Func f2 : funList)
    {
        // If the time intervals of f1 and f2 overlap, then remove both of them.
        if ((f2.startTime >= f1.startTime && f2.startTime <= f2.endTime) ||
            (f2.endTime >= f1.startTime && f2.endTime <= f2.endTime))
        {
            funcsToRemove.add(f1);
            funcsToRemove.add(f2);
        }
    }
}
for (Func toRemove : funcsToRemove)
    funlist.remove(toRemove);