Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们可以直接在java中检查一组子字符串是否存在于较大的字符串中吗_Java - Fatal编程技术网

我们可以直接在java中检查一组子字符串是否存在于较大的字符串中吗

我们可以直接在java中检查一组子字符串是否存在于较大的字符串中吗,java,Java,前。 .com出现在amazon.com中 对于包含相反顺序的功的 它检查“amazon.com”。包含(“.com”) 但我需要找到它 .com是否包含在amazon.com中 因为我有一个要检查的(.com、.org等)值列表使用regex 当最后一个字符串匹配时,它将为真 String str = "amazon.com"; System.out.println(str.matches(".*(com|org|in)")); 我想你想要这样的东西: private boo

前。 .com出现在amazon.com中 对于包含相反顺序的功的 它检查“amazon.com”。包含(“.com”) 但我需要找到它 .com是否包含在amazon.com中
因为我有一个要检查的(.com、.org等)值列表

使用regex

当最后一个字符串匹配时,它将为真

    String str = "amazon.com";
    System.out.println(str.matches(".*(com|org|in)"));

我想你想要这样的东西:

private boolean checkUrl(String url, List<String> suffixes) {
    boolean isValid = false;
    //Loop through all the correct suffixes
    for(String suffix : suffixes) {
        //If the suffix exists then we can set the variable to true and break the loop so we can return true.
        if(url.endsWith(suffix)) {
            isValid = true;
            break;
        }
    }

    return isValid;
}
public static boolean hasAny(String text, String[] values)
{
    for (String value : values)
    {
        if (text.contains(value))
            return true;
    }
    return false;
}
private boolean checkUrl(字符串url,列表后缀){
布尔值isValid=false;
//循环遍历所有正确的后缀
for(字符串后缀:后缀){
//如果后缀存在,那么我们可以将变量设置为true并中断循环,以便返回true。
if(url.endsWith(后缀)){
isValid=true;
打破
}
}
返回有效;
}

一种方法是将搜索算法拆分为如下内容:

convert
[".com", ".org"]
to
[
    '.': [
        'c': [
            'o': [
                'm': []
            ]
        ],
        'o': [
            'r': [
                'g': []
            ]
        ]
    ]
]
然后,您可以循环输入字符串中的所有字符,并找到单个字符的字符树。 然后你可以走到树的末尾,当你在某个点上找到一个空地图时,你已经找到了一个匹配项。如果你根本没有找到一个地图,那么它就不是一个匹配项

这个类将编译搜索树,并有一个与某些输入匹配的方法

public class CharSearch
{
    private final Map<Character, CharSet> charSets;

    public CharSearch(String[] values)
    {
        charSets = new HashMap<>();
        for (String value : values)
            addValue(value);
    }

    public void addValue(String value)
    {
        addValue(value.toCharArray(), 0);
    }

    public void addValue(char[] value, int index)
    {
        if (value == null || value.length == 0)
            return;

        CharSet charSet = charSets.computeIfAbsent(value[index], k -> new CharSet());
        charSet.addValue(value, index +1);
    }

    public String toString()
    {
        return getClass().getName() + charSets.toString();
    }

    public int match(String input)
    {
        char[] characters = input.toCharArray();
        for (int i = 0; i < characters.length; i++)
        {
            CharSet charSet = charSets.get(characters[i]);
            if (charSet != null)
            {
                if (charSet.match(characters, i) >= 0)
                    return i;
                else
                    break;
            }
        }
        return -1;
    }
}

class CharSet
{
    final Map<Character, CharSet> nextChars;
    boolean isLocked = false;

    CharSet()
    {
        this.nextChars = new HashMap<>();
    }

    public String toString()
    {
        return nextChars.toString();
    }

    void addValue(char[] value, int index)
    {
        if (isLocked)
            return;
        if (value.length <= index)
        {
            isLocked = true;
            nextChars.clear();
            return;
        }

        CharSet charSet = nextChars.computeIfAbsent(value[index], k -> new CharSet());
        charSet.addValue(value, index +1);
    }

    int match(char[] input, int index)
    {
        if (nextChars.isEmpty())
            return index;

        index++;
        if (input.length <= index)
            return -1;

        CharSet charSet = nextChars.get(input[index]);
        if (charSet != null)
        {
            return (charSet.match(input, index));
        }
        return -1;
    }
}
这将打印出“6”和“-1”

我假设要检查的值很少(本例中为2),这将比实际执行以下简单操作慢:

private boolean checkUrl(String url, List<String> suffixes) {
    boolean isValid = false;
    //Loop through all the correct suffixes
    for(String suffix : suffixes) {
        //If the suffix exists then we can set the variable to true and break the loop so we can return true.
        if(url.endsWith(suffix)) {
            isValid = true;
            break;
        }
    }

    return isValid;
}
public static boolean hasAny(String text, String[] values)
{
    for (String value : values)
    {
        if (text.contains(value))
            return true;
    }
    return false;
}
但是检查的值越多,SearchChar方法的效率就越高,而hasAny()方法的效率就越低。 (请注意,效率的提高并不意味着运行时会下降。)

通过将只有一个子集的集合映射到一起,可以优化此算法:

[
    '.': [
        'com': [],
        'org': []
    ]
]
或者通过添加一个长度检查,将每个树的最小长度与正在计算的字符串的剩余长度(char[])进行比较

或者跳过多个具有高智能预测的字符

但这应该足够玩了;)

编辑: 当你的所有输入(例如)都以一个点开始时,这里的效率就来了。 在简单检查中,需要O(n*t),其中n是输入中的字符数,t是检查以查找匹配的起始字符的值数

在CharSearch中,需要O(n)才能找到匹配项的起始字符。 最后的复杂度为O(n*(1~L)),其中L是您输入的值的最大长度…如果我没有弄错的话,这与String.contains()的复杂度相同


(虽然大O符号可能不是正确的符号,但我认为对理解它的人来说应该非常清楚。)

String#endsWith
?为什么那是contains()检查不是你的答案?
“amazon.com”。contains(.com)
完全符合你想要的字符串的相反方向。endsWith()可以检查特定的值。。。我有一组值,比如.com、.org、.in等等。。。我需要找到包含这些值的字符串,如果这些值增加,值就无关紧要了,它将始终检查大括号(com | org | in)中的最后一个结束字符串。这非常慢,因为你需要检查1M的值