我们说我在列表项中的某个位置有一个值,其值是File file = new File(Environment.getExternalStorageDirectory(), "Folder_name");
if (!file.exists()) {
file.mkdirs();
}
的范围。
然后让我说我使用来自3-10
的范围进行搜索。
由于搜索范围的下端(5-15
)属于列表中的条目范围(5
),因此它应该匹配。
为此,我必须检查搜索中的任一范围值是否落在条目的范围值之间,反之亦然。
虽然我有一个工作功能,但我想知道是否有一种通用模式或内置方式来做这种"范围矩阵"在JavaScript中过滤。我甚至都不知道这种事情是否有一些实际的命名法。
答案 0 :(得分:0)
或许这更像是Code Review问题,而不是Stack Overflow问题,但是因为我们在这里......
基于your repl.it demo,您似乎在询问是否有更简单的方法来编写此代码:
var matchesRange = function(min, max, value) {
return value >= min && value <= max;
};
var matchesRangeMatrix = function(searchRange, targetRange) {
return matchesRange(searchRange.min, searchRange.max, targetRange.min) ||
matchesRange(searchRange.min, searchRange.max, targetRange.max) ||
matchesRange(targetRange.min, targetRange.max, searchRange.min) ||
matchesRange(targetRange.min, targetRange.max, searchRange.max);
};
您可以使用两个对象参数调用matchesRangeMatrix()
,每个对象参数都有min
和max
属性。
此代码总共进行了八次比较(四次调用matchesRange
,每次调用两次)。
只需进行两次比较,您就可以做到这一切。让我们取出matrix
命名法,因为这似乎让它听起来比它复杂得多。相反,名为rangesOverlap()
的函数如何:
function rangesOverlap( one, two ) {
return one.min < two.max && two.min < one.max;
}
这就是你所需要的!试试这个updated version of your repl.it并将结果与原始结果进行比较。
如果您想知道这么简单的事情是如何起作用的,我邀请您阅读this Hacker News discussion我和其他一些人就这个话题进行辩论的地方。 (我&#39; m&#34; Stratoscope&#34;在那边,但特别是在&#34; barrkel&#34;在页面下方约三分之一的位置查找此问题的真值表。)
讨论的背景是两项任命是否发生冲突。例如,即使第一个会议在第二个会议开始的同一时间结束,但是从晚上1-2点和2-3点的约会将不冲突。如果您对重叠范围的定义不同,那么1-2和2-3将被视为重叠,您应该可以使用<=
代替<
来执行此操作:
function rangesOverlap( one, two ) {
return one.min <= two.max && two.min <= one.max;
}
但是公平警告,我还没有测试过这个版本的代码。
请注意,这不是JavaScript的任何特定内容。相同的问题和相同的解决方案几乎适用于任何编程语言。