From f2589da828c1ddb5fc1a84a308cfcea208664905 Mon Sep 17 00:00:00 2001 From: clodan Date: Wed, 29 Jan 2025 15:29:29 +0000 Subject: [PATCH] StringSimilarity added --- .../GiveCommand/StringSimilarity.cs | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Libraries/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/StringSimilarity.cs diff --git a/Libraries/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/StringSimilarity.cs b/Libraries/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/StringSimilarity.cs new file mode 100644 index 00000000..472598d6 --- /dev/null +++ b/Libraries/Core/Helpers/Dialogue/Commando/SptCommands/GiveCommand/StringSimilarity.cs @@ -0,0 +1,37 @@ +namespace Core.Helpers.Dialogue.Commando.SptCommands.GiveCommand; + +public static class StringSimilarity +{ + /** + * Converted from: https://github.com/stephenjjbrown/string-similarity-js/blob/master/src/string-similarity.ts + */ + public static double Match(string str1, string str2, int substringLength = 2, bool caseSensitive = false) + { + if (!caseSensitive) { + str1 = str1.ToLower(); + str2 = str2.ToLower(); + } + + if (str1.Length < substringLength || str2.Length < substringLength) + return 0; + + var map = new Dictionary(); + for (var i = 0; i < str1.Length - (substringLength - 1); i++) { + var substr1 = str1.Substring(i, substringLength); + map.Add(substr1, map.TryGetValue(substr1, out var value) ? value + 1 : 1); + } + + var match = 0; + for (var j = 0; j < str2.Length - (substringLength - 1); j++) { + var substr2 = str2.Substring(j, substringLength); + var count = map.GetValueOrDefault(substr2, 0); + if (count > 0) { + map.Add(substr2, count - 1); + match++; + } + } + + return match * 2D / (str1.Length + str2.Length - ((substringLength - 1D) * 2D)); + } + +}