Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:查找字符串中的前10个单词。最有效的算法是什么?_Java_Algorithm - Fatal编程技术网

Java:查找字符串中的前10个单词。最有效的算法是什么?

Java:查找字符串中的前10个单词。最有效的算法是什么?,java,algorithm,Java,Algorithm,我正在尝试编写一些代码来检索字符串的前10个单词 我能想象的最好的算法是将字符串按空格分割,然后取前10个元素。但是,这不是很有效,因为字符串可能很长 Java中有没有更好的算法可以实现这一点 非常感谢。您可以使用特定的限制-不要调用regex规则超过11次 它将创建一个String[]对象,其中前10个元素是独立的单词,最后一个元素包含尚未检查规则的单词[因此它不会分割字符串的其余部分]您可以使用String.split()指定限制 从: limit参数控制应用阵列的次数,因此会影响结果阵列的

我正在尝试编写一些代码来检索字符串的前10个单词

我能想象的最好的算法是将字符串按空格分割,然后取前10个元素。但是,这不是很有效,因为字符串可能很长

Java中有没有更好的算法可以实现这一点

非常感谢。

您可以使用特定的限制-不要调用regex规则超过11次


它将创建一个
String[]
对象,其中前10个元素是独立的单词,最后一个元素包含尚未检查规则的单词[因此它不会分割字符串的其余部分]

您可以使用
String.split()
指定限制

从:

limit参数控制应用阵列的次数,因此会影响结果阵列的长度。如果限制n大于零,则模式最多应用n-1次,数组长度不大于n,数组的最后一个条目将包含最后一个匹配分隔符之外的所有输入。如果n为非正,则图案将被应用尽可能多的次数,并且阵列可以具有任意长度。如果n为零,则将尽可能多次应用该模式,数组可以有任何长度,并且将丢弃尾随的空字符串

尝试:

StringTokenizer st=新的StringTokenizer(“我是一个非常长的字符串”);
对于(int i=0;i<10&&st.hasMoreTokens();i++){
System.out.println(st.nextToken());
}

只需从左向右扫描:

static String[] first10Words(String s) {
    List<String> l = new ArrayList<String>();
    int pos = 0;
    while (l.size() < 10) {
        int newPos = s.indexOf(' ', pos);
        if (newPos == -1) {
            l.add(s.substring(pos));
            break;
        }
        l.add(s.substring(pos, newPos));
        pos = newPos + 1;
    }
    return l.toArray(new String[0]);
}
静态字符串[]前10个字(字符串s){
列表l=新的ArrayList();
int pos=0;
而(l.尺寸()<10){
int newPos=s.indexOf(“”,pos);
如果(newPos==-1){
l、 添加(s.子字符串(pos));
打破
}
l、 添加(s.子字符串(pos,newPos));
pos=newPos+1;
}
返回l.toArray(新字符串[0]);
}
是否使用正则表达式

public String getFirst10Words(String arg) {
    Pattern pattern = Pattern.compile("([\\S]+\\s*){1,10}");
    Matcher matcher = pattern.matcher(arg);
    matcher.find();
    return matcher.group();
}

我是java新手,但我做过一个更基础的:

public void getSummary () {
    int count=0;
    int position=0;
    for ( count = 0 ; count < 10 ; count++ )
    {
        position = yourString.indexOf(" ", position+1);
    }
    System.out.println(yourString.substring(0,position)+"...");
}
public void getSummary(){
整数计数=0;
int位置=0;
用于(计数=0;计数<10;计数++)
{
position=yourString.indexOf(“”,position+1);
}
System.out.println(字符串.子字符串(0,位置)+“…”);
}

是的,只需在前10个空格上拆分,忽略字符串的其余部分。效率不高的was正则表达式效率不高(它们使用简单,通常更重要),如果您有一个长字符串,您必须至少读取字符串的开头,以找到第十个字的结尾。这可能会导致内存泄漏,因为只有在10个子字符串同时存在的情况下,原始的大字符串才会被gc’ed。我不认为这会导致内存泄漏,你能详细说明一下吗?这个解决方案比其他解决方案复杂得多。这是事实,但拆分速度要快得多。诚然,StringTokenizer的速度并不慢。@Daniel:每次调用
s.substring(pos)
都会创建一个对旧的大字符串的新引用。这些引用禁止对原始字符串进行gc'ed
public void getSummary () {
    int count=0;
    int position=0;
    for ( count = 0 ; count < 10 ; count++ )
    {
        position = yourString.indexOf(" ", position+1);
    }
    System.out.println(yourString.substring(0,position)+"...");
}