0

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

例子:

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. 我打算StringUtils从 Apache Commons 使用,但该split方法返回一个数组!因此,我应该使用 for 循环从 split 返回的字符串对象数组中提取字符串。那效率高吗:我不知道,split创建一个数组!
  3. Splitter我从番石榴那里读到过,但这篇文章指出这StringUtils在实践中更好。
  4. ScannerJava.util. _ 它似乎没有分配任何额外的数据结构。不是吗?

请绘制最有效的 Java 解决方案,即使使用其他广泛使用的库,如GuavaApache Commons

4

5 回答 5

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

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

于 2013-04-09T15:24:57.983 回答
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;
}

至于你关于ArrayListvsLinkedList最后插入的声明,也许你应该阅读这个

于 2013-04-09T14:51:25.200 回答
0

要不就Arrays.asList((s1 + " " + s2 + " " + s3).split("\\s+"))

于 2013-04-09T14:58:47.053 回答
0

首先使用分隔符连接字符串(请参阅使用分隔符连接字符串)。然后:

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

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

于 2013-04-09T14:59:14.967 回答
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]);
    }
}

}

于 2013-04-09T15:42:43.540 回答