有一个字符串String s="汉语注释天安门thanks一些别的人的姓名fale";
另外有个关键字数组String[] keywords={"姓名","汉语","一些","天安门","fale","thanks","学习"};
现在要求对s遍历一次然后打印出s中所出现的keywords中的关键字内容一直没有考虑清除,求各位大虾帮忙
另外有个关键字数组String[] keywords={"姓名","汉语","一些","天安门","fale","thanks","学习"};
现在要求对s遍历一次然后打印出s中所出现的keywords中的关键字内容一直没有考虑清除,求各位大虾帮忙
String str = "汉语注释天安门thanks一些别的人的姓名fale";
String[] keywords = { "姓名", "汉语", "一些", "天安门", "fale", "thanks", "学习" }; //只遍历一遍str是很慢的,因为对于这个输入遍历了49次keywords和1次str
long start = System.nanoTime();
Set<String> result1 = evaluate(str, keywords);
long end = System.nanoTime();
System.out.println(end - start);
System.out.println(result1); //这个是很快的,因为遍历了7次keywords和7次str
Set<String> result2 = new HashSet<String>();
start = System.nanoTime();
for (String word : keywords) {
if (str.contains(word)) {
result2.add(word);
}
}
end = System.nanoTime();
System.out.println(end - start);
System.out.println(result2);
} public static Set<String> evaluate(String str, String[] keywords) throws IOException {
HashSet<String> result = new HashSet<String>();
StringBuffer fBuffer = new StringBuffer();
PushbackReader scanner = new PushbackReader(new CharArrayReader(str
.toCharArray()));
int c = scanner.read();
while (c != -1) {
if (isWordStart((char) c, keywords)) {
fBuffer.setLength(0);
do {
fBuffer.append((char) c);
c = scanner.read();
} while (c != -1 && isWordPart((char) c, keywords));
scanner.unread(c);
String buffer = fBuffer.toString();
for (String key : keywords) {
if (buffer.indexOf(key) != -1) {
result.add(key);
}
}
}
c = scanner.read();
}
return result;
} public static boolean isWordPart(char c, String[] keywords) {
for (String word : keywords)
if (word.indexOf(c) != -1)
return true;
return false;
} public static boolean isWordStart(char c, String[] keywords) {
for (String word : keywords)
if (c == word.charAt(0))
return true;
return false;
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Test {
public static void main(String[] args) {
String[] keywords={"姓名","汉语","一些","天安门","fale","thanks","学习"}; // 将关键词的首字符作散列处理,首字符作为 key,关键词作为 value
Map<Character, List<char[]>> map = new HashMap<Character, List<char[]>>();
for(int i = 0; i < keywords.length; i++) {
Character c = keywords[i].charAt(0);
List<char[]> list = map.get(c);
if(list == null) {
list = new ArrayList<char[]>();
map.put(c, list);
}
list.add(keywords[i].toCharArray());
}
String s = "汉语注释天安门thanks一些别的人的姓名fale"; char[] chs = s.toCharArray();
for(int i = 0; i < chs.length; i++) {
List<char[]> list = map.get(chs[i]);
if(list == null) {
continue;
}
keywords:
for(int j = 0, m = list.size(); j < m; j++) {
char[] kchs = list.get(j);
if(i + kchs.length > chs.length) {
continue;
}
for(int k = 0; k < kchs.length; k++) {
if(chs[i + k] != kchs[k]) {
break keywords;
}
}
System.out.println(kchs);
}
}
}
}