有一个字符串String s="汉语注释天安门thanks一些别的人的姓名fale";
另外有个关键字数组String[] keywords={"姓名","汉语","一些","天安门","fale","thanks","学习"};
现在要求对s遍历一次然后打印出s中所出现的keywords中的关键字内容一直没有考虑清除,求各位大虾帮忙

解决方案 »

  1.   

    public static void main(String[] args) throws IOException {
    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;
    }
      

  2.   

    我遍历了一次s就要遍历多次keywords吗?
      

  3.   

    import java.util.ArrayList;
    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);
                }
            }
        }
    }