如何使用Java中的给定字符串值从数组列表中查找最长前缀?

Posted

技术标签:

【中文标题】如何使用Java中的给定字符串值从数组列表中查找最长前缀?【英文标题】:How to find longest prefix from array list using given string value in Java? 【发布时间】:2020-05-08 04:50:18 【问题描述】:
String[] num =  "1201", "12018", "1201800","12018000" ;

String prefix="120180000175135";

我有两个变量,一个是字符串数组,另一个是字符串。 现在我想使用前缀从字符串数组中获取最长的值。请建议我如何在 Java 中做到这一点。

请同时查看我的解决方案,但它在上述情况下不起作用。

private static Item binarySearch(Item[] a, String key) 
    int low = 0;
    System.out.println("a.length" + a.length);
    int high = a.length - 1;

    while (low <= high) 
        int mid = (low + high) >>> 1;
        int len = Math.min(key.length(), a[mid].key.length());
        String midVal = a[mid].key.substring(0, len);
        String cmpKey = key.substring(0, len);
        if (midVal.compareTo(cmpKey) > 0)
            low = mid + 1;
        else if (midVal.compareTo(cmpKey) < 0)
            high = mid - 1;
        else
            return a[mid];
    
    return null;

【问题讨论】:

【参考方案1】:

假设您的数字数组按长度升序排序,您可以向后迭代并使用String#startsWith,打印第一个匹配项:

String[] num =  "1201", "12018", "1201800","12018000" ;
String prefix = "120180000175135";

for (int i=num.length-1; i >= 0; i--) 
    if (prefix.startsWith(num[i])) 
        System.out.println("Longest match is: " + num[i]);
        break;
    

如果数字数组没有已经排序,那么您可以进行排序,或者您必须迭代整个未排序的数组并跟踪每个匹配项的长度。

【讨论】:

【参考方案2】:

或者使用流:

String[] num =  "1201", "12018", "1201800","12018000" ;
String prefix = "120180000175135";
    
Optional<String> match = Arrays.asList(num).stream()
    .sorted(Comparator.comparingInt(String::length).reversed())
    .filter(prefix::startsWith)
    .findFirst();
System.out.println("Longest match is: " + match.orElse("no match found"));

【讨论】:

以上是关于如何使用Java中的给定字符串值从数组列表中查找最长前缀?的主要内容,如果未能解决你的问题,请参考以下文章

Django通过列表中的值从数据库中查找项目?

java - 如何使用PriorityQueue集合从Java中的给定数组在O(n)时间内构建最大堆?

C语言丨如何查找数组(序列)中的最大值或者最小值?

如何在统一的字符串数组列表中查找包含?

在排序数组列表中查找2个最接近的先前值和2个最接近的下一个值

在给定的字符串列表中查找字符串的所有字谜