Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串中的重复字符问题_Java_String_Substring - Fatal编程技术网

Java字符串中的重复字符问题

Java字符串中的重复字符问题,java,string,substring,Java,String,Substring,我有一个学校作业,我需要做一个函数,接受一个字符串和一个字母。然后它复制字符串中的字母并返回它。例如,如果我像这样调用函数 System.out.println(重复(“hello world”、“l”),它应该输出hellllo-worlld。但是,当我进行此调用时,代码反而输出Helllo wlorld。这是我的密码: public static String duplicate(String s, String letter){ String rv = s; for(i

我有一个学校作业,我需要做一个函数,接受一个字符串和一个字母。然后它复制字符串中的字母并返回它。例如,如果我像这样调用函数
System.out.println(重复(“hello world”、“l”),它应该输出hellllo-worlld。但是,当我进行此调用时,代码反而输出Helllo wlorld。这是我的密码:

  public static String duplicate(String s, String letter){
    String rv = s;
    for(int i=0; i<s.length(); i++){
      String a = s.substring(i,i+1);
      if (letter.compareTo(a) == 0){
        rv = rv.substring(0, i) + a + rv.substring(i);
      }
    }
    return rv;
  }
公共静态字符串重复(字符串s、字符串字母){
字符串rv=s;

对于(inti=0;i,考虑到所有的约束条件,这就是我能想到的

公共静态字符串重复(字符串s、字符串字母){
字符串ans=“”;
对于(int i=0;i
正如评论部分所建议的,StringBuilder是首选方法

公共静态字符串重复(字符串s、字符串字母){
StringBuilder ans=新的StringBuilder();
对于(int i=0;i
考虑到您的所有限制,这是我能想到的

公共静态字符串重复(字符串s、字符串字母){
字符串ans=“”;
对于(int i=0;i
正如评论部分所建议的,StringBuilder是首选方法

公共静态字符串重复(字符串s、字符串字母){
StringBuilder ans=新的StringBuilder();
对于(int i=0;i
如果可以使用indexOf,则不需要遍历for循环中的所有字符

    int i = 0;
    while (true) {
        int index = s.indexOf(letter, i);
        if(index == -1 ) return s;
        s = s.substring(0, index) + letter + s.substring(index);
        i = index + 2;
    }

如果可以使用indexOf,则不需要遍历for循环中的所有字符

    int i = 0;
    while (true) {
        int index = s.indexOf(letter, i);
        if(index == -1 ) return s;
        s = s.substring(0, index) + letter + s.substring(index);
        i = index + 2;
    }

因此,一个真正快速的案头检查将突出潜在的问题

+----+---+----+
|  i | a | rv |
+----+---+----+
| 00 | h |  h |
| 01 | e |  e |
| 02 | l |  l |
| 03 | l |  l |
| 04 | o |  l |
| 05 |   |  l |
| 06 | w |  o |
| 07 | o |    |
| 08 | r |  w |
| 09 | l |  o |
| 10 | d |  o |
+----+---+----+
问题是,“插入”点没有正确更新,您只是继续使用当前的搜索索引,而不是通过已经进行的更改数量来偏移位置

我个人的偏好是使用
StringBuilder
,但既然你不能这样做,那么一个极端简单的方法,不管怎样,它将遵循相同的一般方法,可能看起来像

public static String duplicate(String s, String letter) {
    String rv = "";
    for (int i = 0; i < s.length(); i++) {
        String a = s.substring(i, i + 1);
        if (letter.compareTo(a) == 0) {
            rv += a;
        }
        rv += a;
    }
    System.out.println(rv);
    return rv;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=“”;
对于(int i=0;i
但是,如果您不允许这样做,那么您需要跟踪每个新字符所需的“偏移量”,例如,基于在其前面插入的其他字符数

public static String duplicate(String s, String letter) {
    String rv = s;
    int delta = 0;
    for (int i = 0; i < s.length(); i++) {
        String a = s.substring(i, i + 1);
        if (letter.compareTo(a) == 0) {
            rv = rv.substring(0, i + delta) + a + rv.substring(i + delta);
            delta += 1;
        }
    }
    System.out.println(rv);
    return rv;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=s;
int delta=0;
对于(int i=0;i
因此,快速的案头检查将突出潜在问题

+----+---+----+
|  i | a | rv |
+----+---+----+
| 00 | h |  h |
| 01 | e |  e |
| 02 | l |  l |
| 03 | l |  l |
| 04 | o |  l |
| 05 |   |  l |
| 06 | w |  o |
| 07 | o |    |
| 08 | r |  w |
| 09 | l |  o |
| 10 | d |  o |
+----+---+----+
问题是,“插入”点没有正确更新,您只是继续使用当前的搜索索引,而不是通过已经进行的更改数量来偏移位置

我个人的偏好是使用
StringBuilder
,但既然你不能这样做,那么一个极端简单的方法,不管怎样,它将遵循相同的一般方法,可能看起来像

public static String duplicate(String s, String letter) {
    String rv = "";
    for (int i = 0; i < s.length(); i++) {
        String a = s.substring(i, i + 1);
        if (letter.compareTo(a) == 0) {
            rv += a;
        }
        rv += a;
    }
    System.out.println(rv);
    return rv;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=“”;
对于(int i=0;i
但是,如果您不允许这样做,那么您需要跟踪每个新字符所需的“偏移量”,例如,基于在其前面插入的其他字符数

public static String duplicate(String s, String letter) {
    String rv = s;
    int delta = 0;
    for (int i = 0; i < s.length(); i++) {
        String a = s.substring(i, i + 1);
        if (letter.compareTo(a) == 0) {
            rv = rv.substring(0, i + delta) + a + rv.substring(i + delta);
            delta += 1;
        }
    }
    System.out.println(rv);
    return rv;
}
公共静态字符串重复(字符串s、字符串字母){
字符串rv=s;
int delta=0;
对于(int i=0;i
就我个人而言,我会使用类似于
StringBuilder的东西来创建新的
字符串
很好的建议@MadProgrammer,您可以在给定索引的字符后插入。@MadProgrammer不幸的是,我无法使用StringBuilder来完成此任务。我只能使用compareTo、substring、length和indexOfIns代替字母。比较到(a)==0
为什么不比较
s.charAt(i)==letter
其中
letter
是char类型。使用's.substring(i,i+1)没有多大意义除非您需要使用字符串,否则您可以从中获得可用字符。@Jason任务规定我们必须亲自使用StringBuilder,我会使用类似于
StringBuilder的东西来创建新的字符串