Java 从textview进行字符串标记化
我有一个文本视图,文本是动态变化的。 我想用分隔符空格“”标记此文本并发送到另一个textview 这是我的密码Java 从textview进行字符串标记化,java,android,eclipse,Java,Android,Eclipse,我有一个文本视图,文本是动态变化的。 我想用分隔符空格“”标记此文本并发送到另一个textview 这是我的密码 public void onClick(View v) { // TODO Auto-generated method stub if (v.getId()==R.id.button5){ Intent i = new Intent(this, Tokenizing.class); String test = ((TextVie
public void onClick(View v) {
// TODO Auto-generated method stub
if (v.getId()==R.id.button5){
Intent i = new Intent(this, Tokenizing.class);
String test = ((TextView)findViewById(R.id.textView6)).getText().toString();
String result = null;
StringTokenizer st2 = new StringTokenizer(test," ");
while (st2.hasMoreTokens()) {
String st3 = st2.nextToken();
System.out.println(st3);
result = st3;
}
i.putExtra("result", result);
startActivity(i);
Log.i("Test Klik Next", result);
但我在文本视图中只有最后一句话。
标记化前的文本:
Examples of paradoxes can be humorous and confusing
confusing
标记化后的文本:
Examples of paradoxes can be humorous and confusing
confusing
我的编码错误的部分在哪里?每次读取新令牌时都会覆盖结果
while (st2.hasMoreTokens()) {
String st3 = st2.nextToken();
System.out.println(st3);
result = st3; // Everytime you are reassigning result to some other String
}
result = st3;
所以它总是等于最后一个值。将结果类型从String
更改为,并在运行时构建它
result.append(st3 + " "); //re-adding the space as the StringTokenizer will remove it
然后在StringTokenizer
循环之后,只需使用result.toString()
为什么不
结果+=st3
?
其他一些答案建议你这样做。不这样做的原因是,在Java中,String
是不可变的。这意味着它们不能更改,因此,每当您附加两个String
对象时,都会创建一个新的String
对象。
因此,通过循环的每一步,您都在创建一个新的String
对象,这是低效且不必要的StringBuilder
不是不可变的,可以将String
s附加到它,而无需每次创建新对象的开销
StringTokenizer
值得注意的是,@RGraham在评论中说,这个类已经被弃用了。这意味着它不再常用,不鼓励使用,并且可能在某个时候被删除。代币-输入或输出 由于其他答案与我截然相反,在讨论了上述答案之一之后,我觉得我需要澄清这一点。我 “我不确定您的目的是不是要去掉代币(在本例中为空格“”)并最终得到
Examplesofparadoxescanbehumorousandconfusing
或者在输出最后的字符串时替换它们,并取出您输入的内容。所以我假设你想保留原来的意思并替换它们。否则,获得上述结果的一个更快的方法就是跳过所有标记化并执行以下操作
test.replaceAll(" ","");
每次读取新令牌时,都会覆盖结果
result = st3;
所以它总是等于最后一个值。将结果类型从String
更改为,并在运行时构建它
result.append(st3 + " "); //re-adding the space as the StringTokenizer will remove it
然后在StringTokenizer
循环之后,只需使用result.toString()
为什么不结果+=st3
?
其他一些答案建议你这样做。不这样做的原因是,在Java中,String
是不可变的。这意味着它们不能更改,因此,每当您附加两个String
对象时,都会创建一个新的String
对象。
因此,通过循环的每一步,您都在创建一个新的String
对象,这是低效且不必要的StringBuilder
不是不可变的,可以将String
s附加到它,而无需每次创建新对象的开销
StringTokenizer
值得注意的是,@RGraham在评论中说,这个类已经被弃用了。这意味着它不再常用,不鼓励使用,并且可能在某个时候被删除。
代币-输入或输出
由于其他答案与我截然相反,在讨论了上述答案之一之后,我觉得我需要澄清这一点。我
“我不确定您的目的是不是要去掉代币(在本例中为空格“”)并最终得到
Examplesofparadoxescanbehumorousandconfusing
或者在输出最后的字符串时替换它们,并取出您输入的内容。所以我假设你想保留原来的意思并替换它们。否则,获得上述结果的一个更快的方法就是跳过所有标记化并执行以下操作
test.replaceAll(" ","");
替换
result=st3代码>由(初始化字符串结果=”;
)
result+=st3+“”
然后更换
i.putExtra(“结果”,结果)带有i.putExtra(“result”,result.trim())的code>代码>
试试这个,它会显示完美的效果
您也可以这样做result.append(st3+)然后i.putExtra(“result”,result.trim())代码>更换
result=st3代码>由(初始化字符串结果=”;
)
result+=st3+“”
然后更换
i.putExtra(“结果”,结果)带有i.putExtra(“result”,result.trim())的code>代码>
试试这个,它会显示完美的效果
您也可以这样做result.append(st3+)然后i.putExtra(“result”,result.trim())代码>它在任何地方都没有错,它在做你让它做的事情。您希望结果变量包含什么?目前它只包含最后一个单词。您的结果每次都会在循环中更新。并将在最后说最后一句话。如果你想对每一个单词都做些什么,那么就在循环中做吧。它在任何地方都没有错,它在做你让它做的事情。您希望结果变量包含什么?目前它只包含最后一个单词。您的结果每次都会在循环中更新。并将在最后说最后一句话。如果您想对每个单词执行某些操作,那么在循环中执行也可能值得注意,StringTokenizer是一个遗留类,出于兼容性原因而保留,在new codereplaceString result=null中不鼓励使用它代码>带有StringBuilder结果=新的StringBuilder()
并用我在帖子中建议的代码替换result=st3
。最后,替换i.putExtra(“结果”,result)代码>带有i.putExtra(“result”,result.toString())代码>是的工作兄弟我尝试你的代码并添加结果。追加(st3+'\n');像这样的悖论例子的结果可能是幽默和混乱的,谢谢兄弟,下一步我想去掉标点符号,把文本改成小写。你能帮我个忙吗