Java如何实现URL前缀最长匹配,从URL列表中查找最长匹配项
Java 实现URL最长匹配前缀
实现逻辑
- 先处理空列表、空搜索字符串等边界情况
- 遍历待匹配URL列表,逐个计算与搜索URL的公共前缀
- 所有公共前缀中取长度最长的作为最终结果
- 提供两种匹配规则:
- 逐字符通用匹配:适用于任意字符串前缀匹配场景
- 按URL路径段匹配:按
/拆分路径后匹配完整段,更贴合URL业务场景,输出结果和示例要求完全一致
完整代码示例
按路径段匹配(推荐,符合示例输出要求)
import java.util.List; import java.util.Arrays; public class UrlPrefixMatcher { public static String findLongestPathPrefix(List<String> urls, String searchUrl) { if (urls == null || urls.isEmpty() || searchUrl == null || searchUrl.isBlank()) { return ""; } String longestPrefix = ""; // 提前拆分搜索URL的路径段,避免重复计算 String[] searchParts = searchUrl.split("/", -1); for (String url : urls) { String[] urlParts = url.split("/", -1); int minLen = Math.min(urlParts.length, searchParts.length); int matchCount = 0; // 逐段匹配 while (matchCount < minLen && urlParts[matchCount].equals(searchParts[matchCount])) { matchCount++; } // 拼接匹配到的路径段 String currentPrefix = String.join("/", Arrays.copyOf(urlParts, matchCount)); // 更新最长前缀 if (currentPrefix.length() > longestPrefix.length()) { longestPrefix = currentPrefix; } } return longestPrefix; } public static void main(String[] args) { List<String> urls = List.of( "/a/b/c/d", "/a/b/a/d", "/a/a/c/d", "/q/w/e/r/" ); String search = "/a/b/c/e/q"; // 输出结果为 /a/b/c,和示例要求完全一致 System.out.println(findLongestPathPrefix(urls, search)); } }
逐字符通用匹配版本
import java.util.List; public class CharPrefixMatcher { public static String findLongestCharPrefix(List<String> urls, String search) { if (urls == null || urls.isEmpty() || search == null || search.isBlank()) { return ""; } String longestPrefix = ""; for (String url : urls) { int minLen = Math.min(url.length(), search.length()); int i = 0; while (i < minLen && url.charAt(i) == search.charAt(i)) { i++; } String currentPrefix = url.substring(0, i); if (currentPrefix.length() > longestPrefix.length()) { longestPrefix = currentPrefix; } } return longestPrefix; } }
内容的提问来源于stack exchange,提问作者Mr Doro
相关产品推荐
相关产品推荐

