如何在Java中交换字符串的第一个和最后一个字符?

时间:2009-06-22 16:17:42

标签: java

我在夏天练习尝试变得更好,我对以下内容感到困惑:

http://www.javabat.com/prob/p123384

  

给定一个字符串,返回一个新的字符串,其中第一个和最后一个字符已被交换。


示例:

frontBack("code") → "eodc"
frontBack("a") → "a"
frontBack("ab") → "ba"

代码:

public String frontBack(String str) 
{
    String aString = "";

    if (str.length() == 0){
        return "";
    }

    char beginning = str.charAt(0);
    char end = str.charAt(str.length() - 1);

    str.replace(beginning, end);
    str.replace(end, beginning);

    return str;
}

17 个答案:

答案 0 :(得分:9)

字符串可以拆分为字符数组,可以使用字符数组。有关String对象的更多详细信息,请转到Java API并单击左下方窗格中的String。该窗格按字母顺序排序。

编辑:由于有些人更加彻底,我想我会提供更多细节。使用String的.toCharArray()方法创建一个char数组。取第一个元素并将其存储在char中,将第一个元素与最后一个元素交换,然后将存储在char中的元素放入数组的最后一个元素中,然后说:

String temp = new String(charArray);

并返回。这假设charArray是你的字符数组。

答案 1 :(得分:7)

我建议使用String.replace方法获取排除第一个和最后一个字母的字符,然后连接beginning和{{1},而不是使用String.substring方法。 } characters。

此外,end方法将替换所有出现的指定字符,并返回带有所述替换的新String.replace。由于上面的代码中没有提到退货,String来电在这里做的确不多。

这是因为Java中的String.replace是不可变的,因此String方法无法对原replace进行任何更改,在这种情况下String变量


另外,对于长度为1的str,此方法效果不佳。使用上述方法,调用源String的{​​{1}}长度为1将导致String.substring,因此如果采取上述方法,也必须将其作为特殊情况处理。

坦率地说,indyK1ng's answer中提供的方法,其中StringStringIndexOutOfBoundsException获得,并执行开头和结尾字符的简单交换,然后生成char[]来自修改后的String开始听起来更加愉快。

答案 2 :(得分:4)

Java中的

String个实例是不可变的。这意味着您无法更改String中的字符;不同的字符序列需要一个新对象。因此,当您使用replace方法时,请丢弃原始字符串,然后使用该方法的结果。

但是,对于此方法,您可能希望将String实例转换为可变的字符数组(char[])。在交换所需的字符后,使用该数组创建一个新的String实例。

答案 3 :(得分:2)

一些提示:

  • 字符串是不可变的,这意味着它们无法更改。因此,str.replace()不会更改str,而是会返回一个新字符串。

  • 可能replace不是最好的...考虑frontBack("abcabc"):您的函数如果已更正,则会将'a'替换为'c',并产生{{} {1}},然后"cbccbc" 'c'屈服'a'。那不太对劲!

答案 4 :(得分:2)

replace中的String方法实际上会返回String,因此如果您坚持使用replace,则可以执行以下操作:

beginReplace = str.replace( beginning, end );
endReplace = beginReplace.replace( end, beginning );
return( str );

但这实际上无法解决您的特定问题,因为replace会替换字符串中字符的所有出现次数并替换它。

例如,如果我的字符串是“apple”而我说“apple”.replace('p','q'),结果字符串将是“aqqle”。

答案 5 :(得分:2)

又一个例子 ,没有创建其他对象

if (str.length() > 1) {
    char[] chars = str.toCharArray();
    // replace with swap()
    char first = chars[0];
    chars[0] = chars[chars.length - 1];
    chars[chars.length - 1] = first;
    str = new String(chars);
}

return str;

编辑:执行swap = length = 1字符串是no-op。

编辑2: dfa对copyValueOf的更改没有任何意义,因为Java源代码在String.java中说:“//所有公共String构造函数现在都复制数据。”并且调用只是委托给字符串构造函数。

答案 6 :(得分:2)

你可以使用正则表达式..

return str.replaceFirst("(.)(.*)(.)", "$3$2$1");

答案 7 :(得分:1)

另一种略有不同的方法,让您了解各种可能性。我建议你注意短字符串的快速退出(而不是在if()子句中嵌套更复杂的处理),以及使用String.format(),因为它是你工具箱中的一种方便的技巧,并不是因为它在这个特定的例子中明显优于常规的“+”连接。

public static String exchange(String s) {
    int n = s.length();
    if (n < 2)
        return s;
    return String.format("%s%s%s", s.charAt(n - 1), s.substring(1, n - 1), s.charAt(0));
}

答案 8 :(得分:1)

简单的解决方案是:

public String frontBack(String str) {
  if (str == null || str.length() == 0) {
    return str;
  }
  char[] cs = str.toCharArray();
  char first = cs[0];
  cs[0] = cs[cs.length -1];
  cs[cs.length -1] = first;
  return new String(cs);
}

使用字符数组(注意讨厌的空String或null String参数!)


另一个解决方案使用StringBuilder(它通常用于执行String manupilation,因为String本身是不可变的。

public String frontBack(String str) {
  if (str == null || str.length() == 0) {
    return str;
  }
  StringBuilder sb = new StringBuilder(str);  
  char first = sb.charAt(0);
  sb.setCharAt(0, sb.charAt(sb.length()-1));
  sb.setCharAt(sb.length()-1, first);
  return sb.toString();
}

另一种方法(更多用于指导而非实际使用)是这个方法:

public String frontBack(String str) {
  if (str == null || str.length() < 2) {
    return str;
  }
  StringBuilder sb = new StringBuilder(str);
  String sub = sb.substring(1, sb.length() -1);
  return sb.reverse().replace(1, sb.length() -1, sub).toString();
}

这里反转完整的字符串,然后用子字符串替换不应该反转的部分。 ;)

答案 9 :(得分:0)

if (s.length < 2) {
   return s;
}
return s.subString(s.length - 1) + s.subString(1, s.length - 2) + s.subString(0, 1);

(未经测试,索引可能是一个......

答案 10 :(得分:0)

您可以使用此代码:

public String frontBack(String str) {
    if (str.length() <= 1) 
        return str;

    String mid = str.substring(1, str.length()-1);

    // last + mid + first
    return str.charAt(str.length()-1) + mid + str.charAt(0);
}

答案 11 :(得分:0)

public String lastChars(String a, String b) {

  if(a.length()>=1&&b.length()>=1){
   String str = a.substring(0,1);
    String str1 =b.substring(b.length()-1);
    return str+str1;
}
else if(a.length()==0&&b.length()==0){
 String v ="@";
String z ="@";
return v+z;
   }
   else if(a.length()==0&&b.length()>=1){

   String s ="@";
   String s1 = b.substring(b.length()-1);
   return s+s1;
   }
   else if(a.length()>=1&&b.length()==0){
   String f= a.substring(0,1);
   String h = "@";
   return f+h;
   }
   return a;
   }

答案 12 :(得分:0)

您可以使用表示“可变字符序列”的StringBuilder 它具有解决问题所需的所有方法:charAt,setCharAt,length和toString。

答案 13 :(得分:0)

public String frontBack(String input)
{
    return
        input.substring(input.length() - 1) +  // The last character
        input.substring(1, input.length() - 1) +  // plus the middle part
        input.substring(0, 1);                  // plus the first character.
}

答案 14 :(得分:-1)

class swap 
{
public static void main(String[] args) 
{
    Scanner s=new Scanner(System.in);
    System.out.println("no of elements in array");
    int n=s.nextInt();
    int a[]=new int[n];
    System.out.println("Elements");
    for(int i=0;i<n;i++)
    {
        a[i]=s.nextInt();
    }
    int b[]=new int[n];
    for(int i=0;i<n;i++)
    {
        b[i]=a[i];
    }
    int end=n-1;
    b[0]=b[end];
    b[end]=a[0];
    for(int i=0;i<n;i++)
    {
        System.out.println(b[i]);
    }   
}
}

答案 15 :(得分:-1)

if (str.length() <= 1) {
  return str;
}

String mid = str.substring(1, str.length()-1);
return str.charAt(str.length()-1) + mid + str.charAt(0);

答案 16 :(得分:-5)

    function frontBack(str: string) { 


         return str.slice(str.length - 1) + str.slice(1, -1) + str.slice(0, 1) 

    }

切片会“删掉”最后一个字母。计算字符串的长度str.length -1,(加)提醒切片字符串,从索引1开始,是在索引-1处表示的最后一个字符,(加号)切割在索引0到的最后一个字母指数1.