Вот что я написал для своего проекта:
var glob = require('glob');
var minimatch = require("minimatch");
function globArray(patterns, options) {
var i, list = [];
if (!Array.isArray(patterns)) {
patterns = [patterns];
}
patterns.forEach(function (pattern) {
if (pattern[0] === "!") {
i = list.length-1;
while( i > -1) {
if (!minimatch(list[i], pattern)) {
list.splice(i,1);
}
i--;
}
}
else {
var newList = glob.sync(pattern, options);
newList.forEach(function(item){
if (list.indexOf(item)===-1) {
list.push(item);
}
});
}
});
return list;
}
И назовите это так (Используя массив):
var paths = globArray(["**/*.css","**/*.js","!**/one.js"], {cwd: srcPath});
или вот это (Используя одну строку):
var paths = globArray("**/*.js", {cwd: srcPath});
Посмотрите на расстояние Левенштейна . Это способ измерить, насколько две строки отличаются друг от друга.
Надеюсь, я правильно понял ваш вопрос; использование «расстояния» в одном предложении с «широтой и долготой» может сбивать с толку!
Хотя написано на c (с привязками python и tcl), libdistance может быть инструментом для применения нескольких метрик расстояния к строкам / данным.
Включенные метрики:
Вы можете получить неплохие результаты, используя фонетический алгоритм , чтобы найти имена с небольшими ошибками.
Кроме того, если вы используете более механическое расстояние редактирования, вы, вероятно, увидеть лучшие результаты, используя взвешенную функцию, которая учитывает геометрию клавиатуры (т.е. физически близкие клавиши «дешевле» заменить, чем удаленные). Кстати, это запатентованный метод, так что будьте осторожны, чтобы не написать то, что станет слишком популярным;)
Я взял на себя смелость перевести кусок кода C #, который я написал для вычисления расстояния Левенштейна, в код Java. Он использует только два одномерных массива, которые чередуются вместо большого массива с зазубринами:
public static int getDifference(String a, String b)
{
// Minimize the amount of storage needed:
if (a.length() > b.length())
{
// Swap:
String x = a;
a = b;
b = x;
}
// Store only two rows of the matrix, instead of a big one
int[] mat1 = new int[a.length() + 1];
int[] mat2 = new int[a.length() + 1];
int i;
int j;
for (i = 1; i <= a.length(); i++)
mat1[i] = i;
mat2[0] = 1;
for (j = 1; j <= b.length(); j++)
{
for (i = 1; i <= a.length(); i++)
{
int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1);
mat2[i] =
Math.min(mat1[i - 1] + c,
Math.min(mat1[i] + 1, mat2[i - 1] + 1));
}
// Swap:
int[] x = mat1;
mat1 = mat2;
mat2 = x;
mat2[0] = mat1[0] + 1;
}
// It's row #1 because we swap rows at the end of each outer loop,
// as we are to return the last number on the lowest row
return mat1[a.length()];
}
Он не был тщательно протестирован, но, похоже, работает нормально. Он был основан на реализации Python, которую я сделал для университетского упражнения. Надеюсь, это поможет!
Я бы порекомендовал либо Расстояние Левенштейна , либо ] Расстояние Жаккара для сравнения текста.