- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定一组已排序的非重叠连续区间,如何添加新区间或从中删除现有区间。请建议我一个好的数据结构来存储这些间隔,这可以使这些更改成为可能。
例子:
Given collection: [1,4), [4,9), [9,12)
Insert: [5,8)
Result: [1,4), [4,5), [5, 8), [8, 9), [9, 12)
Delete: [4, 5)
Result: [1,5), [5, 8), [8, 9), [9, 12)
在删除的情况下,如果可能的话,它应该首先添加到前一个,否则下一个。
最佳答案
我根本不会为离散间隔而烦恼。由于定义需要“排序的非重叠连续间隔”,我只存储间隔的边界(“intervalBoundaries
”),然后从该列表中,我将按需创建间隔范围(“getRanges()
").
这里是我的例子(也许应该修改“deleteRange()
”-方法以涵盖边缘情况):
/*
*/
package de.test.stackoverflow;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
public class Intervals {
public static final class Range {
final int from;
final int to;
public Range(int from, int to) {
this.from = from;
this.to = to;
}
public int getFrom() {
return from;
}
public int getTo() {
return to;
}
@Override
public String toString() {
return String.format("[%d, %d)", from, to);
}
}
final SortedSet<Integer> intervalBoundaries = new java.util.TreeSet<>();
public List<Range> getRanges() {
final List<Range> res = new java.util.ArrayList<>();
if (intervalBoundaries.size() > 1) {
final List<Integer> tmpBounds = new java.util.ArrayList<>(intervalBoundaries);
for (int i = 0; i < tmpBounds.size() - 1; i++) {
res.add(new Range(tmpBounds.get(i), tmpBounds.get(i + 1)));
}
}
return res;
}
public void insertBoundary(Integer bound) {
// duplicates in sets are automatically removed
intervalBoundaries.add(bound);
}
public void insertRange(Integer from, Integer to) {
intervalBoundaries.add(from);
intervalBoundaries.add(to);
}
public void insertRange(Range x) {
insertRange(x.getFrom(), x.getTo());
}
public void deleteRange(Range x) {
final Collection<Integer> boundsToDelete = new java.util.LinkedHashSet<>();
for (Integer intervalBoundary : intervalBoundaries) {
if (intervalBoundary >= x.getFrom() && intervalBoundary < x.getTo()) {
boundsToDelete.add(intervalBoundary);
}
}
intervalBoundaries.removeAll(boundsToDelete);
if (x.getTo() < intervalBoundaries.last()) {
insertBoundary(x.getTo());
}
if (x.getFrom() > intervalBoundaries.last()) {
insertBoundary(x.getFrom());
}
}
public static void main(String[] args) {
Intervals i = new Intervals();
i.insertRange(new Range(1, 4));
i.insertRange(new Range(4, 9));
i.insertRange(new Range(9, 12));
System.out.println("Given collection: " + StringUtils.join(i.getRanges(), ", "));
final Range insertRange = new Range(5, 8);
System.out.println("insert: " + insertRange);
i.insertRange(insertRange);
System.out.println("Result: " + StringUtils.join(i.getRanges(), ", "));
final Range deleteRange = new Range(4, 5);
System.out.println("delete: " + deleteRange);
i.deleteRange(deleteRange);
System.out.println("Result: " + StringUtils.join(i.getRanges(), ", "));
final Range deleteRange2 = new Range(3, 9);
System.out.println("delete: " + deleteRange2);
i.deleteRange(deleteRange2);
System.out.println("Result: " + StringUtils.join(i.getRanges(), ", "));
final Range deleteRange3 = new Range(2, 15);
System.out.println("delete: " + deleteRange3);
i.deleteRange(deleteRange3);
System.out.println("Result: " + StringUtils.join(i.getRanges(), ", "));
}
}
关于java - 插入或删除到非重叠连续区间集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55414822/
我对具有 2 个轴的数据有交叉识别问题,例如 A = array([['x0', 'y0', 'data0', 'data0'], ['x0', 'y0', 'data0', '
我知道这是代码有点傻,但有人可以解释为什么 isList [42]返回 True而isList2 [42]打印 False ,以及如何防止这种情况?我想更好地理解一些更晦涩的 GHC 类型扩展,我认为
我正在使用memmove(),但目标似乎正在覆盖源,或者也许我不明白覆盖是什么。我有一个 char 数组(目标),然后是一个指向目标的指针,该指针位于 vector 内部。 char destinat
以下AS3代码有时会导致音频多次播放,就像疯狂的回声一样,几乎同时播放。通常使用该URL都可以,但是当我使用https://soundcloud.com url时,它总是会发疯。在极少数情况下,我认为
我正在尝试在 android 2.2 中实现类似操作栏的东西。这是我的 main.xml
如何避免第一个值的重叠问题 而且,我怎样才能看到最后一个被剪裁的值? 最佳答案 我认为您在修改轴上的样式和调整视口(viewport)之间有几种选择。 我会尝试: 禁用左轴,启用右轴 chart.le
我正在构建一个简单的应用程序,您可以在其中使用纸娃娃之类的工具来描述您的外观。 Check out this image.计划是有 4 个水平 ScrollView :第一个用于发型,第二个用于面部毛
我有一个问题...我在绝对布局中有两个 ScrollView 。换句话说,它们是全屏的并且相互重叠 上面的scrollview是水平滚动的,下面的是垂直滚动的scrollview。 当我水平滚动时,我
我看了一些类似的问题,但我不太明白在我的层次结构中我应该做什么? 我有 用于屏幕底部的标签菜单 和 对于其他将创建的 fragment 。 我有 9 个标签菜单,每个都是 fragment 。 一
在我的 Android 应用程序中,我有一个编辑文本和一个按钮,单击该按钮会向我的主要 Activity 添加一个 fragment ,其中包含在我的编辑文本中写入的消息。问题是,当我更改消息并单击按
在我的分段控件中,有时标题比其段宽。我怎样才能让它截断? 假设第 1 段的标题是 Text overlaps,第 2 段的名称是 ok。 我希望它看起来如何: [Text ov...| ok
我想创建一个带有重叠单元格的 uitableview,如下图所示。问题是,即使我为单元格的内容 View 设置 clipsToBounds = NO,单元格假标题(例如,将与前一个单元格重叠的西类牙语
有了这个CSS .addProblemClass{ width:300px; height:300px; /*width:25%; height:40%;*/
我有跨窗口移动的图像(2 行),当我离开页面选项卡时,然后返回它,所有图像都相互堆叠。 JS代码(记入jfriend00) function startMoving(img) { va
这是我的一段代码。图像在 23 毫秒后正常可见,但永远不会像第二行所示那样返回隐藏状态。如果我将其从 17 毫秒更改为大于 23 毫秒的值,它就会起作用。反之亦然,如果我将第一行更改为 16 毫秒,它
我正在可汗学院为学校项目编写一款太空入侵者游戏,但我不知道如何在子弹和外星人之间进行碰撞,然后摆脱子弹所碰撞的外星人。这是非常基本的 JS,尽管我尝试过,但我不太明白如何将有关该主题的其他答案放入我的
当我尝试重新加载 tableView 的数据时出现奇怪的重叠,导致单元格的高度发生变化(使用 UITableViewAutomaticDimension),然后内容与上面的单元格重叠,无法弄清楚怎么做
我是一个新手,如果这是一个愚蠢的问题,请原谅我。我想有一个部分与标题分开,但发生了两种情况: (1) 当我把 在 下面,它们相互重叠,如下所示: Section overlapping header
我正在尝试创建两个 那是重叠的。唯一的问题是第二个 在第一个的前面它必须是相反的。我尝试设置第一个 的 z-index至 1但它仍然不起作用。 这是我的代码: #content{ backgrou
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我是一名优秀的程序员,十分优秀!