在java中反转String

时间:2011-05-09 11:46:57

标签: java

在java中反转字符串的代码: 注意:一个或两个额外的变量是好的。数组的额外副本不是。

现在我实施了一个算法如下:

public static void removeDuplicates(char[] str) {
  if (str == null) return;
  int len = str.length;
  if (len < 2) return;

  int tail = 1;

  for (int i = 1; i < len; ++i) {
   int j;
     for (j = 0; j < tail; ++j) {
       if (str[i] == str[j]) break;
     }
     if (j == tail) {
       str[tail] = str[i];
       ++tail;
     }
   }
   str[tail] = something //something to mark end of char array eg '\0' as we have in C
 }

5 个答案:

答案 0 :(得分:3)

我会这样做(伪代码):

// s is array of char that holds the string
i=0
j=s.length - 1
while (i < j) 
    swap characters at positions i and j
    i++
    j--

答案 1 :(得分:1)

尝试使用Apache Commons StringUtils类:

http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/StringUtils.html

它具有很好的反向功能:

static String reverse(String str);

答案 2 :(得分:1)

如果没有额外的空间,你不能在java中反转String,因为String在java中是不可变的。
这似乎是一个棘手的问题......
如果你想要反转char []它应该是这样的:

    char[] str = "abcdefg".toCharArray();
    int len = str.length;
    int n = len / 2;
    for (int i = 0;i<n;i++) {
        char temp = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = temp;
    }
    System.out.println(str);

答案 3 :(得分:0)

如上所述,无法反转String对象,因为Java中的字符串对象是不可变的。

你可以通过使用反射访问底层数组来避免这种情况(见下文),但这是不可取的。

如果我们将问题视为char[](或任何其他数组)的工作,那么很容易:

/**
 * reverses an array by swapping its elements.
 */
public static void reverse(char[] array) {
    reverse(array, 0, array.length);
}

/**
 * reverses a section of an array by swapping its elements.
 * @param start the start of the section, inclusive
 * @param end the end of the section, exclusive
 */
public static void reverse(char[] array, int start, int end) {
    for(int i = start, j = end-1; i < j; i++, j--) {
        swap(array, i, j);
    }
}

/**
 * swaps two array elements.
 */
private static void swap(char[] array, int i, int j) {
    char help = array[i];
    array[i] = array[j];
    array[j] = help;
}

有了这个,我们现在也可以作弊来扭转现有的字符串:

public static void reverse(String s) {
    Class<String> sClass = String.class;
    char[] array = (char[])sClass.getDeclaredField("value").get(s);
    int start = sClass.getDeclaredField("offset").getInt(s);
    int len = sClass.getDeclaredField("count").getInt(s);
    reverse(array, start, start+len);
}

如上所述,这是不可取的,因为整个VM和标准库都基于字符串是不可变的这一事实。此外,此处的字段名称取自1.6.0_13 Sun实现,其他VM可能具有这些字段的其他名称,或者以其他方式存储字符串。

答案 4 :(得分:-2)

也许是这样的?

string input = "ABCD";
string result = "";
for (int i = input.length-1; i >= 0; i--)
{
  result = result + input[i];
}