尝试在Java中反转字符串时出错

时间:2014-02-05 21:41:41

标签: java

我正在尝试做一个简单的反向任务,例如:将字符串“你好吗”改为“你就是这样”。

这是我的代码:

public class Program {
    public static String revSentence (String str) {
        String [] givenString = str.split(" ");
        String [] retString = new String[givenString.length];

        int last = givenString.length - 1;

        for (int i = 0; i < givenString.length; i++) {
            retString [i] = givenString[last--]; 
        }

        return retString.toString();
    }

    public static void main(String[] args) {
        String m = "how are you";
        System.out.println(revSentence(m));
    }
}

我得到了一个奇怪的输出:

[Ljava.lang.String;@e76cbf7

7 个答案:

答案 0 :(得分:4)

输出根本不是“怪异” - 它是由Object.toString()创建的Object的内部字符串表示。 String[]不会覆盖它。如果要输出所有entires,循环遍历它们并将它们连接起来,最好使用StringBuilder来避免创建不必要的String实例。

public static String arrayToString (String[] array) {
    StringBuilder result = new StringBuilder();
    for (String value : array) {
        result.append(value);
    }
    return StringBuilder.toString();
}

如果您不需要该方法,并希望将其包含在反转句子的整个过程中,那么它就是这样的样子。它只迭代一次,向后迭代(=倒计时)以反转句子。

public static String revSentence (String str) {
    String []     givenString = str.split(" ");
    StringBuilder result      = new StringBuilder();

    // no need for 'last', we can use i to count down as well...
    for (int i = givenString.length - 1 ; i >= 0; i--) { 
        result.append(givenString[i]);
    }
    return result.toString();
}

[编辑]:由于OP对其中一个答案的评论,关于尚未学习如何使用StringBUilder,这里是一个不使用一个的arrayToStirng方法。 请注意,这不应该正常进行,因为它会创建无用的String实例,因为String({1}}的所有实例都不会被GC清理掉保留以供重复使用。)

public static String arrayToString (String[] array) {
    String result = "";
    for (String value : array) {
        result += value;
    }
    return result;
}

或者,没有专用的arrayToString方法:

public static String revSentence (String str) {
    String []     givenString = str.split(" ");
    String        result      = "";

    for (int i = givenString.length-1 ; i >= 0 ; i--) { 
        result += givenString[i];
    }
    return result;
}

答案 1 :(得分:2)

这是一个解决方案:

public class Program {
    public static String revSentence (String str) {
        String retString = "";
        String [] givenString = str.split(" ");

        for (int i=givenString.length-1; i>=0; i--) {
            retString += givenString[i] + " "; 
        }
        return retString;
    }


    public static void main(String[] args) {
        String m = "how are you";
        System.out.print(revSentence(m));
    }

}

修改它使“revSentence”函数返回一个String,加上改进了一下代码。享受!

答案 2 :(得分:1)

在数组对象上调用toString()(在您的情况下为retString)不会打印所有数组条目,而是打印对象地址。

您应该通过迭代来打印数组条目。

答案 3 :(得分:1)

将此代码用于反向字符串

StringBuilder builder = new StringBuilder();
for(String s : retString) {
    builder.append(s);
}
return builder.toString();

答案 4 :(得分:0)

在数组上调用toString会为你提供内存参考,这对你来说并不是很有用。试试这个:

public static String revSentence (String str) {
    String[] givenString = str.split(" ");

    StringBuilder sb = new StringBuilder();
    for (int i = givenString.length - 1; i >= 0; i--) {
        sb.append(givenString[i]);
        if (i != 0)
          sb.append(" ");
    }
    return sb.toString();
}

答案 5 :(得分:0)

for循环从较长的长度开始到较低的builder.append(givenString[i] + " ");这将连接字符串并返回整个句子你是你可以同时使用mySentence += givenString[i] + " ";builder.append(givenString[i] + " ");但最好的方法是使用StringBuilder课程(请参阅docs

public class Program {
public static String revSentence(String str) {
    String[] givenString = str.split(" ");
    String[] retString = new String[givenString.length];

    int last = givenString.length - 1;
    //String mySentence = "";

    StringBuilder builder = new StringBuilder();

    for (int i = givenString.length - 1; i >= 0; i--) {
        // retString [i] = givenString[i];
        // mySentence += givenString[i] + " ";
        builder.append(givenString[i] + " ");
    }

    return builder.toString(); // retuning String
            //return mySentence;
}

public static void main(String[] args) {
    String m = "how are you";
    System.out.println(revSentence(m));
}

}

答案 6 :(得分:-1)

更快,更短: 要翻转单词,请使用:

public String reverseWord(String s) {
    StringBuilder y = new StringBuilder(s);
    return y.reverse();
}

现在拆分并使用此方法并使用Stringbuidler.append来连接所有。 并且不要忘记中间的空间。