我有一个这样的课程
public class Func {
String id;
long startTime;
long endTime;
}
并在其中一个方法中列出了这些类对象
List<Func> funList = new ArrayList<Func>();
从这个funList中删除对象的最佳方法是startTime和endTime与同一列表中的另一个对象相交。
我能想到的一种方法是将列表中的每个对象与其他对象进行比较,并将id放在其他数据结构中(如果它相交)。在将每个对象与其他对象进行比较后,浏览保存ID的数据结构并将其从列表中删除。
答案 0 :(得分:1)
复杂性:O(n ln n)
编辑示例:
答案 1 :(得分:1)
如果您的funList很小,您可以在O(n*n)
时间内将每个项目与其他项目进行比较,检查重叠。对于每对项a
和b
,如果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);