确定字符串中重复字符的位置,并在它们之间添加连字符

时间:2018-02-12 20:36:25

标签: java string

我知道有类似的问题已被提出,但没有答案足以满足我的目的。我想编写一个程序,它接受一个字符串并将该字符串传递给一个方法。一旦传递给方法,该方法将通过它搜索字符串并找到重复字符出现的位置并在它们之间添加连字符。我只想使用java api中的charAt(),length()和/或substring()方法。只是为了澄清,如果字符串“Hello”传递给我的方法,那么该方法将返回“Hel-lo”。我在下面写了一些代码。

class ServiceImpl<T> {
  create(data: Array<Partial<T>>, params?: Params): Promise<T[]>; 
  create(data: Partial<T>, params?: Params): Promise<T>;
  create(data: Partial<T> | Array<Partial<T>>, params?: Params): Promise<T | T[]>;
  create(data: Partial<T> | Array<Partial<T>>, params?: Params) : Promise<T> | Promise<T[]> {
    return null!;  // impl
  }

  patch(id: NullableId, data: Pick<T, keyof T>, params?: Params): Promise<T>;
  patch(id: NullableId, data: Partial<T>, params?: Params): Promise<T>;
  patch(id: NullableId, data: Pick<T, keyof T> | Partial<T>, params?: Params): Promise<T> {
    return null!; // impl
  }

  // other methods
}

function getService<T>(): Service<T> {
  return new ServiceImpl<T>(); // okay
}

}

2 个答案:

答案 0 :(得分:1)

如果您要求它修改String,但String中的java不可修改,并且每次插入或删除字符时,新字符串对象已创建。这就是为什么在一般情况下,要创建新字符串,您必须使用StringBuilder。您可以从此类的JavaDoc获取更多信息。

public static String separateDuplicatesChars(String str) {
    if (str == null)
        return null;
    if (str.trim().isEmpty())
        return str;

    char prv = '\0';
    StringBuilder buf = new StringBuilder(str.length());


    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);

        if (prv == ch)
            buf.append('-');

        buf.append(ch);
        prv = ch;
    }

    return buf.toString();
}

或仅使用length()charAt()substring()

public static String separateDuplicatesChars(String str) {
    if (str == null)
        return null;

    int size = str.length();
    int[] letters = new int[26];

    for (int i = 0; i < str.length(); i++) {
        char ch = str.charAt(i);
        char base = ch >= 'A' && ch <= 'Z' ? 'A' : ch >= 'a' && ch <= 'z' ? 'a' : '\0';

        if (base == '\0')
            continue;

        int letter = str.charAt(i) - base;

        if (letters[letter] != 0)
            size++;

        letters[letter]++;
    }

    char[] arr = new char[size];

    for (int i = 0, j = 0; i < str.length(); i++, j++) {
        char ch = str.charAt(i);

        if (i > 0 && arr[i - 1] == ch)
            arr[j++] = '-';

        arr[j] = ch;
    }

    return new String(arr);
}

答案 1 :(得分:0)

你关闭了。只需创建一个新的String,您将返回它,并在循环遍历char数组时构建它。如果您需要添加连字符,只需添加连字符。