Java 如何替换某个字符中除一次以外的所有事件?
如果我有一个像Java 如何替换某个字符中除一次以外的所有事件?,java,Java,如果我有一个像telephone这样的字符串,并希望输出返回为tel*phon*,我该怎么做 程序将打印出字符串中的每个字母。如果这是那封信第一次出现,我会写的。但如果它再次出现,我会打印一个星号 hello将是hel*o 再见将是go*dbye 协调将是协调*** 请帮忙,谢谢!这不是家庭作业。。。这是期末考试的练习!谢谢 我正在尝试这样的事情。。。但我不知道该怎么走得更远。。。请帮忙 import java.util.Scanner; public class firstOccurrence
telephone
这样的字符串,并希望输出返回为tel*phon*
,我该怎么做
程序将打印出字符串中的每个字母。如果这是那封信第一次出现,我会写的。但如果它再次出现,我会打印一个星号
hello
将是hel*o
再见
将是go*dbye
协调
将是协调***
请帮忙,谢谢!这不是家庭作业。。。这是期末考试的练习!谢谢
我正在尝试这样的事情。。。但我不知道该怎么走得更远。。。请帮忙
import java.util.Scanner;
public class firstOccurrence{
public static void main(String[] args){
Scanner keyboard = new Scanner(System.in);
String s;
int i, j, count;
System.out.print("Enter string: ");
s = keyboard.nextLine();
for(i = 0; i < s.length(); i++){
count = 0;
for(j = i+1; i < s.length(); j++){
if(s.charAt(i) == s.charAt(j))
count++;
}
if(count < 1)
System.out.print(s.charAt(i));
else
System.out.print("*");
}
}
}
import java.util.Scanner;
公共类第一次出现{
公共静态void main(字符串[]args){
扫描仪键盘=新扫描仪(System.in);
字符串s;
int i,j,计数;
System.out.print(“输入字符串:”);
s=键盘.nextLine();
对于(i=0;i
我该如何编辑这个精确的代码使其工作?请帮助:(扫描仪键盘=新扫描仪(System.in);
字符串s;
System.out.print(“输入字符串:”);
s=键盘.nextLine();
Set-occure=new-HashSet();
StringBuilder stb=新的StringBuilder();
对于(int i=0;i中给出了解决此问题的简单方法。它迭代输入字符串的每个字符,并建立到目前为止看到的一组字符,使用当前字符建立输出StringBuilder
,如果已经看到当前字符,则替换当前字符
这个问题似乎应该适用于Java 8流处理。有一个新函数String.chars()
,它将字符串
转换为字符
的流。(但是没有CharStream
,因此每个char
都表示为int
,流类型为IntStream
为此,我们需要编写一个映射器函数,该函数可以用替换字符替换字符,但前提是该字符已经被看到。因此,我们需要一个有状态的映射器函数,这有点不同寻常。不过,使用高阶函数编写映射器函数并不太困难:
public static IntUnaryOperator replaceIfSeen(int replacement) {
Map<Integer,Boolean> seen = new ConcurrentHashMap<>();
return i -> seen.putIfAbsent(i, Boolean.TRUE) == null ? i : replacement;
}
我们获取输入字符串并将其转换为字符流(表示为int
)并在其上调用我们的条件映射器函数,要求它用*
字符替换重复项。mapToObj
操作有点麻烦,因为我们需要将int
的char
部分转换为一个字符串。然后我们收集并将这些字符串连接到输出中。结果与OP预期的一样
请注意,如果流并行运行,其行为会有所不同。在某种程度上,它仍然可以工作,因为任何给定的字符只出现一次,而所有其他字符都被替换为*
。区别在于,未替换的字符可能不是第一个。例如,给定输入字符串协调结果可能是c**rd*natio*
这里有一个regex方法来解决这个问题,它可以不使用任何外部容器来跟踪替换:
String s = "coordination";
while(s.matches(".*?(\\w)(?=.*?\\1).*")) {
s = s.replaceAll("(?<=(\\w))((?:(?!\\1).)*)\\1", "$2*");
}
System.out.println( s );
//=> co*rdinat***
String s=“协调”;
while(s.matches(“.*?(\\w)(?=.*?\\1)。*”){
s=s.replaceAll(“(?学习正则表达式的时间到了!对于每个字符,请检查它是否包含在列表中。如果不包含,请打印它,将其添加到列表中。如果是,则打印输出“*”。@我们的老师没有教我们正则表达式。基本上,我们应该能够在没有任何正则表达式的情况下完成此程序。请给出一个输入示例nd输出给定代码,并将代码包装在main
中,这样我们就可以编译它。顺便说一句,@blurfus的提示是一个很好的提示。你的方法看起来不错,除了第二个for
,并且你打印字符的if
语句位于错误的位置。例如,如果i=5
例如,对于(j=…)
循环,您希望在中查看哪些字符?
static String replace(String input) {
return input.chars()
.map(replaceIfSeen('*'))
.mapToObj(i -> String.valueOf((char)i))
.collect(joining());
}
String s = "coordination";
while(s.matches(".*?(\\w)(?=.*?\\1).*")) {
s = s.replaceAll("(?<=(\\w))((?:(?!\\1).)*)\\1", "$2*");
}
System.out.println( s );
//=> co*rdinat***