检查字符串中是否出现多个特定字符

时间:2017-10-07 07:48:09

标签: java

编辑:对于那些贬低我的人,这个问题与你所关联的重复问题有所不同。另一个问题是关于返回索引。但是,就我而言,我不需要索引。我只想检查是否有重复。

这是我的代码:

        String word = "ABCDE<br>XYZABC";
        String[] keywords = word.split("<br>");
        for (int index = 0; index < keywords.length; index++) {
            if (keywords[index].toLowerCase().contains(word.toLowerCase())) {
                if (index != (keywords.length - 1)) {
                    endText = keywords[index];
                    definition.setText(endText);
                }
            }

我的问题是,如果keywords是“ABC”,那么字符串endText将只显示“ABCDE”。但是,“XYZABC”也包含“ABC”。如何检查字符串是否多次出现?如果多次出现,我想让definition textview变为definition.setText(endText + "More");

我试过这个。代码正在运行,但它使我的应用程序非常慢。我想原因是因为我通过word获得了字符串textwatcher

        String[] keywords = word.split("<br>");
        for (int index = 0; index < keywords.length; index++) {
            if (keywords[index].toLowerCase().contains(word.toLowerCase())) {
                if (index != (keywords.length - 1)) {
                    int i = 0;
                    Pattern p = Pattern.compile(search.toLowerCase());
                    Matcher m = p.matcher( word.toLowerCase() );
                    while (m.find()) {
                        i++;
                    }
                    if (i > 1) {
                        endText = keywords[index];
                        definition.setText(endText + " More");
                    } else {
                        endText = keywords[index];
                        definition.setText(endText);
                    }
                }
            }
        }

有没有更快的方法?

5 个答案:

答案 0 :(得分:1)

我理解你的问题有点困难,但听起来像是:

你有一些字符串(例如"ABCDE<br>XYZABC")。您还有一些目标文本(例如"ABC")。您希望将该字符串拆分为分隔符(例如"<br>",然后:

  • 如果只有一个子字符串包含目标,则显示该子字符串。
  • 如果多个子字符串包含目标,则显示包含该字符串的最后一个子字符串加上后缀"More"

在您发布的代码中,由于Pattern.compile()调用,性能非常慢。在每次循环迭代中重新编译Pattern是非常昂贵的。幸运的是,这里不需要正则表达式,所以你可以完全避免这个问题。

    String search = "ABC".toLowerCase();
    String word = "ABCDE<br>XYZABC";
    String[] keywords = word.split("<br>");
    int count = 0;

    for (String keyword : keywords) {
        if (keyword.toLowerCase().contains(search)) {
            ++count;
            endText = keyword;
        }
    }

    if (count > 1) {
        definition.setText(endText + " More");
    }
    else if (count == 1) {
        definition.setText(endText);
    }

答案 1 :(得分:1)

您正在正确地执行此操作,但您正在进行不必要的检查if (index != (keywords.length - 1))。如果最后一个关键字数组元素中存在匹配,则将忽略此项。不确定是您要求的一部分。 当您在第二位找到匹配时提高性能会打破循环。你不需要再检查了。

public static void main(String[] args) {
    String word = "ABCDE<br>XYZABC";
    String pattern = "ABC";
    String[] keywords = word.split("<br>");

    String endText = "";
    int count = 0;

    for (int index = 0; index < keywords.length; index++) {
        if (keywords[index].toLowerCase().contains(pattern.toLowerCase())) {
            //If you come into this part mean found a match.
            if(count == 1) {
                // When you found the second match it will break to loop. No need to check anymore
                // keep the first found String and append the more part to it
                endText += " more";
                break;
            }
            endText = keywords[index];
            count++;
        }
    }
    System.out.println(endText);
}

这将打印ABCDE more

答案 2 :(得分:0)

您好,您必须像这样使用您的条件声明

if (word.toLowerCase().contains(keywords[index].toLowerCase()))

答案 3 :(得分:0)

您可以使用:

String word = "ABCDE<br>XYZABC";
String[] keywords = word.split("<br>");
for (int i = 0; i < keywords.length - 1; i++) {
    int c = 0;

    Pattern p = Pattern.compile(keywords[i].toLowerCase());
    Matcher m = p.matcher(word.toLowerCase());
    while (m.find()) {
        c++;
    }

    if (c > 1) {
        definition.setText(keywords[i] + " More");
    } else {
        definition.setText(keywords[i]);
    }
}

但是就像我在评论中提到的那样,当您想要按"ABCDE<br>XYZABC"拆分时,单词<br>中不会出现双重情况。
但是,如果您使用单词"ABCDE<br>XYZABCDE",则会出现两个单词"ABCDE"

答案 4 :(得分:0)

void test() {
    String word = "ABCDE<br>XYZABC";
    String sequence = "ABC";

    if(word.replaceFirst(sequence,"{---}").contains(sequence)){
       int startIndex =  word.indexOf(sequence);
       int endIndex =  word.indexOf("<br>");
        Log.v("test",word.substring(startIndex,endIndex)+" More");
    }
    else{
            //your code
    }
}

试试这个