Java 使用StringTokenizer将3个字母的单词替换为星号?

Java 使用StringTokenizer将3个字母的单词替换为星号?,java,Java,希望用“*”替换字符串中的所有3个字母单词,例如,如果有人键入“我忘了问”,它将输出“我忘了问***”,这就是我所拥有的,不确定从这里走到哪里 public static void main (String[] args) { c = new Console (); c.print("Enter a string: "); String phrase; phrase = c.readLine(); StringTokenizer phrase = n

希望用“*”替换字符串中的所有3个字母单词,例如,如果有人键入“我忘了问”,它将输出“我忘了问***”,这就是我所拥有的,不确定从这里走到哪里

public static void main (String[] args)
{
    c = new Console ();


    c.print("Enter a string: ");
    String phrase;
    phrase = c.readLine();

    StringTokenizer phrase = new StringTokenizer (phrase);
    while (phrase.hasMoreTokens ())
    {
        c.print (phrase.nextToken());

    }



} // main method

有趣的问题。我使用Java 8解决了您的问题,并添加了一个简单的测试来证明它是有效的:

import org.junit.Test;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.joining;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class SoloTriesToLearn {

    public String wordReplacer(String sentence) {

       return asList(sentence.split(" ")).stream()
               .map(word -> word.length() == 3  ? "***" : word + " ")
               .collect(joining());

    }

    @Test
    public void shouldReplaceWordsWithAsterisk() {
        String result = wordReplacer("I forgot to ask");
        assertThat(result, is("I forgot to ***"));
    }
}
所以基本上我要做的是首先拆分单词,然后流式处理它们,然后做一个映射,检测长度是否为==3,然后返回***。在流的末尾,我通过连接将元素收集回单个字符串

我希望您觉得这段代码很有用,我发现函数方法对于这种操作非常容易

更新 好的,如果你的老师不懂Java8,那么不用担心使用你想要的标记器的顽皮方式;)


有趣的问题。我使用Java 8解决了您的问题,并添加了一个简单的测试来证明它是有效的:

import org.junit.Test;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.joining;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class SoloTriesToLearn {

    public String wordReplacer(String sentence) {

       return asList(sentence.split(" ")).stream()
               .map(word -> word.length() == 3  ? "***" : word + " ")
               .collect(joining());

    }

    @Test
    public void shouldReplaceWordsWithAsterisk() {
        String result = wordReplacer("I forgot to ask");
        assertThat(result, is("I forgot to ***"));
    }
}
所以基本上我要做的是首先拆分单词,然后流式处理它们,然后做一个映射,检测长度是否为==3,然后返回***。在流的末尾,我通过连接将元素收集回单个字符串

我希望您觉得这段代码很有用,我发现函数方法对于这种操作非常容易

更新 好的,如果你的老师不懂Java8,那么不用担心使用你想要的标记器的顽皮方式;)

publicstaticvoidmain(字符串[]args)
{
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入字符串:”);
字符串短语;
短语=input.nextLine();
ArrayList语句=新的ArrayList();
StringTokenizer tokenizer=新的StringTokenizer(短语);
while(tokenizer.hasMoreTokens())
{
add(tokenizer.nextToken());
}
for(字符串:句子)
{
if(word.length()==3)
{
word=“***”;
}
系统输出打印(word+“”);
}
}//主方法
公共静态void main(字符串[]args)
{
扫描仪输入=新扫描仪(System.in);
System.out.println(“输入字符串:”);
字符串短语;
短语=input.nextLine();
ArrayList语句=新的ArrayList();
StringTokenizer tokenizer=新的StringTokenizer(短语);
while(tokenizer.hasMoreTokens())
{
add(tokenizer.nextToken());
}
for(字符串:句子)
{
if(word.length()==3)
{
word=“***”;
}
系统输出打印(word+“”);
}
}//主方法
或只是:

phrase = phrase.replaceAll("\\b[a-zA-Z]{3}\\b", "***");
或者只是:

phrase = phrase.replaceAll("\\b[a-zA-Z]{3}\\b", "***");

检查word的
.length()
,如果它是3 print
***
否则打印word?
字符串短语=c.readLine().replaceAll(“\\D{3}”,***”)
我可以把那行放在c.print下吗?@ElliottFrisch你可能是指
\S
而不是
\D
。另外,最好用
\b
包装此正则表达式,否则我们将用
***
替换所有3个非数字(或非空格)字符,如
abcde
***de
@solotries中,以了解打印是最后一步,在此之前,您需要决定要打印什么。为了使其能够在变量中存储当前令牌。这将允许您对其执行一些方法(如
.length()
以获取字符数),然后可能会将此令牌传递给打印方法。检查word的
.length()
,如果它是3 print
***
则打印word?
字符串短语=c.readLine().replaceAll(\\D{3},“***”)
我可以把那行放在c.print下吗?@ElliottFrisch你可能是指
\S
而不是
\D
。另外,最好用
\b
包装此正则表达式,否则我们将用
***
替换所有3个非数字(或非空格)字符,如
abcde
***de
@solotries中,以了解打印是最后一步,在此之前,您需要决定要打印什么。为了使其能够在变量中存储当前令牌。这将允许您在其上执行一些方法(如
.length()
以获取字符数),然后可能会将此令牌传递给printing方法。感谢您的响应,这是一个在线checkmark类,该类可以帮助我学习Java,您知道如何使用令牌化器吗?@SoloTriesToLearn Ok,当然检查更新。我刚刚添加了代码来使用标记器。我试着运行代码,但得到了10个错误?该类正在使用“Ready to Program Java IDE”,如果这有什么不同的话?如果方便的话,我可以给你看看我们收到的纸条吗@sfrj@SoloTriesToLearn代码编译和运行良好,您可能对如何运行它没有足够的了解。我认为,对您来说最简单的方法是:1-将方法的主体wordReplacer(仅主体)粘贴到主方法中。2-直接将要转换的句子传递到StringTokenizer中。3-添加打印acumulator的println,并删除返回。如果你做得正确,当你运行main方法时,你应该会在你的终端上看到句子打印。谢谢你的回复,这是一个在线的checkmark类,应该可以帮助我学习Java,你知道如何使用标记器吗?@SoloTriesToLearn Ok,当然。检查更新。我刚刚添加了代码来使用标记器。我试着运行代码,但得到了10个错误?该类正在使用“Ready to Program Java IDE”,如果这有什么不同的话?如果方便的话,我可以给你看看我们收到的纸条吗@sfrj@SoloTriesToLearn代码编译和运行良好,您可能对如何运行它没有足够的了解。我认为,对您来说最简单的方法是:1-将方法的主体wordReplacer(仅主体)粘贴到主方法中。2-进入StringTokenizer,直接传递你想要的句子