我在以下方面遇到困难,从字符串中替换某些字符
将有两个输入,第一个是字符,第二个是字符串
然后我需要将字符串中的所有字符替换为它的位置
例如,
我的程序的输入和输出如下,根据要求
绝对正确输入:我这是Ignite (这里"我"是第一个输入"这是Ignite"是第二个输入
输出:th2s 5s 8gn11te
输入:我这是点燃,我是pratik
输出:th2s 5s 8gn11te和20 am prat30k
替换不应区分大小写。 我编写了以下程序,但它有一些错误,Bugs在某种意义上说我实际在线做一些项目而且自动系统由于某些逻辑错误而不接受该程序。自动化系统做了一些测试用例使用不同的输入并检查输出(不是例外或无效输入)有人可以帮我识别吗?
import java.util.*;
import java.io.*;
class rplc
{
public static void main(String args[])
{
String str,temp="";
char ch, ch2;
int arr[]=new int[100];
int len,i,x=0;
Scanner input=new Scanner(System.in);
ch=input.next().charAt(0);
str=input.nextLine();
str=str.replaceAll("^\\s+","");
ch2=ch;
if(Character.isUpperCase(ch))
ch2=Character.toLowerCase(ch);
else if(Character.isLowerCase(ch))
ch2=Character.toUpperCase(ch);
len=str.length();
temp=str;
for(i=0;i<len;i++)
{
if(str.charAt(i)==(int)ch || str.charAt(i)==(int)ch2)
{
arr[x]=i;
x=x+1;
}
}
x=0;
for(i=0;i<len;i++)
{
if(str.charAt(i)==(int)ch || str.charAt(i)==(int)ch2)
{
temp=str.substring(0,i);
temp=temp+(arr[x]);
temp=temp+str.substring(i+1,len);
str=temp;
len=temp.length();
x=x+1;
}
}
System.out.print(temp);
}
}
答案 0 :(得分:1)
好像你的代码应该有效。以防万一我尝试编写一个更简单的程序:
-ver: The version of the code (default = 3)
输出似乎相同。 也许你的函数应该返回值而不是打印它?
答案 1 :(得分:0)
从评论我明白,用户只会输入一个。 以下输入:
我这是点燃,我是pratik
第一个&#39; i&#39;这是需要被替换的特征,这是点燃,我是pratik&#39;。
修改以下内容:
str=input.nextLine();
str=str.replaceAll("^\\s+","");
到
str = input.nextLine();
str = str.substring(1);
str = str.replaceAll("^\\s+", "");
答案 2 :(得分:0)
尝试这样的事情,
Scanner s = new Scanner(System.in);
String Line = s.nextLine();
String ch = Line.substring(0,Line.indexOf(" ")).trim();
Line = Line.substring(Line.indexOf(" ")).trim();
String[] x= Line.split(ch);
String y="";
for(String t:x){
y=y.equals("")?t:y+y.length()+t;
}
System.out.println(y);
答案 3 :(得分:0)
我做了一些代码清理,但最重要的步骤是使用动态大小列表而不是固定大小的数组和带有动态终止而不是for循环的while循环。这是因为当在位置&gt; 9处要替换字符时,输出字符串的长度将改变(增加),因此在代码中,执行可以在结果字符串的中间停止,并且不会替换字符。 甚至有一种特殊情况,当被替换的角色本身就是一个数字时。为了避免问题,我添加了这一行
i = i + Integer.toString(list.get(pos)).length()-1;
以便在输出字符串中跳过新添加的数字字符。
import java.util.*;
import java.io.*;
class rplc
{
public static void main(String args[])
{
List<Integer> list = new ArrayList<Integer>();
Scanner input=new Scanner(System.in);
char ch = input.next().charAt(0);
String str=input.nextLine().trim();
int len=str.length();
for(int i=0;i<len;i++)
{
if(str.charAt(i)==Character.toLowerCase(ch) || str.charAt(i)==Character.toUpperCase(ch))
{
list.add(i);
}
}
int pos = 0;
int i = 0;
while(i<str.length())
{
if(str.charAt(i)==Character.toLowerCase(ch) || str.charAt(i)==Character.toUpperCase(ch))
{
String start = str.substring(0,i)+Integer.toString(list.get(pos));
String end = i<=str.length() ? str.substring(i+1) : "";
i = i + Integer.toString(list.get(pos)).length()-1;
pos++;
str = start.concat(end);
}
i++;
}
System.out.print(str);
}
}
我无法看到任何特殊错误。可能是我忘记了什么。这是我的第一个答案,英语不是我的母语,所以请原谅任何正式错误。
答案 4 :(得分:-1)
我喜欢这个问题所以我自己回答了问题。为脏看的代码道歉。 :)
Scanner input=new Scanner(System.in);
String firstInput=input.nextLine().charAt(0) + "";
//ensure its lower case
firstInput=firstInput.toLowerCase();
String secondInput=input.nextLine();
//ensure char in secondInput is lower cased too.
secondInput=secondInput.replaceAll(firstInput.toUpperCase(),firstInput);
String[] splitted=secondInput.split(firstInput);
String output="";
int current=0;
for(int i=0;i<splitted.length;i++){
String s=splitted[i];
current=current+ s.length();
if(i==splitted.length-1){
output=output+s;
}else{
output=output+s;
output=output+ current;
current++;
}
}
//edited part, as split doesn't split if firstinput is the last character of the string
if(secondInput.endsWith(firstInput)){
output=output+secondInput.length();
}
System.out.println(output);