从Java中的多个字符串构建标记列表的有效方法

时间:2013-04-09 14:49:20

标签: java string guava tokenize apache-commons

我正在寻找一种有效的方法来获取从多个字符串中提取的字符串标记列表(例如,使用空格分隔符)。

示例:

String s1 = "My mom cook everyday";
String s2 = "I eat everyday";
String s3 = "Am I fat?";  
LinkedList<String> tokens = new LinkedList<String>();   
//any code to efficiently get the tokens

//final result is tokens  make of a list of the following tokens:
//"My", "mom", "cook", "everyday", "I", "eat", "everyday", "Am", "I", "fat?".

现在

  1. 我不确定LinkedList是最有效的集合类(Apache Commons,Guava,他们可以帮忙吗?)!
  2. 我打算从Apache Commons使用StringUtils,但split方法会返回一个数组!所以,我应该从一个for循环中提取由split返回的String对象数组中的字符串。效率如此:我不知道,split创建了一个阵列!
  3. 我从Guava那里了解了Splitter,但是this post指出StringUtils在实践中更好。
  4. 来自Scanner的{​​{1}}怎么样?它似乎没有分配任何额外的数据结构。不是吗?
  5. 请绘制最有效的Java解决方案,即使使用其他广泛使用的库,例如 Guava Apache Commons

5 个答案:

答案 0 :(得分:5)

for (String str : Arrays.asList(s1, s2, s3)) {
  Iterables.addAll(tokens, Splitter.on(' ').split(str));
}

将是我这样做的方式。也就是说,对于几乎所有用例,ArrayList优于LinkedList;如果没有进一步的数据,我们真的无法判断您是否处于LinkedList更为可取的罕见情况之一。

答案 1 :(得分:4)

如果你有小字符串并且性能不是问题,你可以将splitaddAll组合成这样:

String s1 = "My mom cook everyday";
String s2 = "I eat everyday";
String s3 = "Am I fat?";  
List<String> tokens = new ArrayList<String>();  

tokens.addAll(Arrays.asList(s1.split("\\s+")));
tokens.addAll(Arrays.asList(s2.split("\\s+")));
tokens.addAll(Arrays.asList(s3.split("\\s+")));

System.out.println(tokens);

但是,如果性能 ,这里的问题是另一种解决方案:

由于没有关于如何获取这些长文本的定义,我将假设它们来自InputStream。看看这种方法的性能是否足以满足您的需求:

public List<String> readTokens(InputStream is) throws IOException{
    Reader reader = new InputStreamReader(is);
    List<String> tokens = new ArrayList<String>();
    BufferedReader bufferedReader = new BufferedReader(reader);
    String line = null;
    while((line = bufferedReader.readLine()) != null){
        String[] lineTokens = StringUtils.split(line, " "); 
        for(int i = 0 ; i < lineTokens.length ; i++){
            tokens.add(lineTokens[i]);
        }
    }
    return tokens;
}

至于你关于ArrayList vs LinkedList最后插入的陈述,或许你应该阅读this

答案 2 :(得分:0)

或仅Arrays.asList((s1 + " " + s2 + " " + s3).split("\\s+"))

答案 3 :(得分:0)

首先使用分隔符加入字符串(请参阅Join a string using delimiters)。然后:

 LinkedList<String> tokens = new LinkedList<String>();
 StringTokenizer st = new StringTokenizer(yourstr); // " " as a default delimiter
 while (st.hasMoreTokens()) {
     tokens.add(st.nextToken());
 }

您在寻找高效或高效的解决方案(即您的约束/参考性能是什么)?

答案 4 :(得分:0)

     import java.util.ArrayList;
     import java.util.Collections;


    public class stringintotoken {
String s="my name is tarun bharti";
ArrayList <String> words=new ArrayList<String>();
public static void main(String[] args)
{
    stringintotoken st=new stringintotoken();
    st.go();
}
public void go()
{
    wordlist();
    System.out.println(words);
    Collections.sort(words);
    System.out.println(words);

}
public void wordlist()
{
    String[] tokens=s.split(" ");
    for(int i=0;i<tokens.length;i++)
    {
    words.add(tokens[i]);
    }
}

}

相关问题