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