有没有比String.split()更有效的方法将String拆分成单词?

时间:2010-11-08 20:56:10

标签: java string

我当前的项目需要在歌曲的歌词上运行搜索,这是Song对象中的String字段。为了提高搜索效率,我在创建歌曲对象时使用String.split("[^a-zA-Z]");将歌词转储到一个集合中,以创建一个String数组,然后添加到一个集合中。

是否有一种特定的方法可以在没有创建数组的中间步骤的情况下将单词添加到集合中?

4 个答案:

答案 0 :(得分:1)

  

是否有一种特定的方法可以将单词添加到一个没有的单词   创建数组的中间步骤?

当然,您可以编写一个返回Iterator对象的方法,该对象一次只能输出一个单词。

但是这样的事情真的不值得优化。你的数组很容易小到适合内存,它的创建不会那么昂贵,垃圾收集器会在之后清理它。

答案 1 :(得分:1)

你在特定歌曲中搜索某些单词吗?如果是这样,你可能真的不需要一套,你可以从你得到歌词的点开始搜索。你可以使用普通的regexp,这可能比分割String更快,把它放到一个集合中然后查询集合:

public class RegexpExample {

public static void main(String[] args) {
    String song = "Is this a real life? Is this just fantasy?";
    String toFind = "is";

    Pattern p = Pattern.compile(toFind, Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(song);

    while (m.find()) {
        String found = m.group();
        int startIndex = m.start();
        int endIndex = m.end();

        System.out.println(found + " at start " + startIndex + ", end " + endIndex);
        //do something with this info...
    }
}

它将输出:

Is at start 0, end 2
is at start 5, end 7
Is at start 21, end 23
is at start 26, end 28

如果您搜索不同的歌曲,可以使用StringBuilder连接其歌词,然后调用StringBuilder#toString并使用toString方法的结果执行整个操作

答案 2 :(得分:0)

StringTokenizer st = new StringTokenizer("the days go on and on without you here");
HashSet<String> words = new HashSet<String>();
while (st.hasMoreTokens()) {
    words.add(st.nextToken());
}

答案 3 :(得分:0)

我不知道效率,但另外,你可以这样做:

import java.io.StringReader;

// ...

public static Set<String> getLyricSet(String lyrics) throws IOException {
    StringReader sr = new StringReader(lyrics);
    StringBuilder sb = new StringBuilder();
    Set<String> set = new HashSet<String>();
    int current;
    // Read characters one by one, returns -1 when we're done
    while ((current = sr.read()) != -1) {
        if (Character.isWhitespace(current)) {
            // End of word, add current word to set.
            set.add(sb.toString());
            sb = new StringBuilder();
        } else {
            sb.append((char) current);
        }
    }
    // End of lyrics, add current word to set.
    set.add(sb.toString());
    sr.close();

    return set;
}