编辑:对于那些贬低我的人,这个问题与你所关联的重复问题有所不同。另一个问题是关于返回索引。但是,就我而言,我不需要索引。我只想检查是否有重复。
这是我的代码:
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);
}
}
}
}
有没有更快的方法?
答案 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
}
}
试试这个