Как я могу обменять первый и последний символы строки в Java? - PullRequest
9 голосов
/ 22 июня 2009

Я практикуюсь летом, чтобы попытаться выздороветь, и я немного застрял в следующем:

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 ]

9 голосов
/ 22 июня 2009

Строки могут быть разбиты на массив символов и могут быть сделаны с массивом символов. Для получения более подробной информации об объектах String перейдите на Java API и нажмите String в нижней левой панели. Эта панель отсортирована в алфавитном порядке.

Редактировать: Поскольку некоторые люди более внимательны, думаю, я приведу дополнительные подробности. Создайте массив символов с помощью метода String .toCharArray (). Возьмите первый элемент и сохраните его в char, поменяйте местами первый элемент с последним и поместите элемент, который вы сохранили в char, в последний элемент массива, затем скажите:

String temp = new String(charArray);

и верни это. Предполагается, что charArray - это ваш массив символов.

7 голосов
/ 22 июня 2009

Вместо того чтобы использовать метод String.replace, я бы предложил использовать метод String.substring, чтобы получить символы, исключая первую и последнюю букву, а затем объединить beginning и end символов.

Кроме того, метод String.replace заменяет все вхождения указанного символа и возвращает новый String с указанными заменами. Так как в приведенном выше коде возврат не обнаружен, вызовы String.replace на самом деле ничего не делают.

Это связано с тем, что String в Java является неизменяемым, поэтому метод replace не может вносить никаких изменений в исходный String, который в данном случае является переменной str.


Также добавим, что этот подход не будет хорошо работать с String s, имеющими длину 1. При использовании подхода, описанного выше, вызов String.substring с источником String, имеющим длину 1, вызовет StringIndexOutOfBoundsException, так что об этом также нужно будет позаботиться как об особом случае, если будет использован вышеуказанный подход.

Честно говоря, подход, представленный в ответе indyK1ng , где char[] получается из String и выполняет простой обмен начальными и конечными символами, а затем String из Модифицированный char[] начинает звучать гораздо приятнее.

4 голосов
/ 22 июня 2009

String экземпляры в Java являются неизменяемыми. Это означает, что вы не можете изменить символы в String; другая последовательность символов требует нового объекта. Поэтому, когда вы используете метод replace, отбросьте исходную строку и используйте вместо этого результат метода.

Однако для этого метода вы, вероятно, захотите преобразовать экземпляр String в массив символов (char[]), которые могут изменяться. После замены требуемых символов создайте новый экземпляр String с этим массивом.

2 голосов
/ 22 июня 2009

Вы можете использовать регулярное выражение ..

return str.replaceFirst("(.)(.*)(.)", "$3$2$1");
2 голосов
/ 22 июня 2009

Еще один пример без создания дополнительных объектов :

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;

Редактировать: Выполнение перестановки по длине = 1 строка недопустима.

Редактировать 2: Изменение dfa на copyValueOf не имело никакого смысла, как говорит источник Java в String.java: «// Все открытые конструкторы String теперь копируют данные». и вызов только что делегирован строковому конструктору.

2 голосов
/ 22 июня 2009

Метод replace в String фактически возвращает String, поэтому, если бы вы настаивали на использовании replace, вы бы сделали:

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

Но это на самом деле не решает вашу специфическую проблему, потому что replace заменяет все вхождения символа в строке с его заменой.

Например, если моей строкой было «яблоко», а я сказал «яблоко» .replace ('p', 'q'), полученная строка будет "aqqle".

2 голосов
/ 22 июня 2009

Пара подсказок:

  • Строки являются неизменяемыми, то есть их нельзя изменить. Следовательно, str.replace() не меняет str, вместо этого он возвращает новую строку.

  • Может быть, replace не самый лучший ... Рассмотрим frontBack("abcabc"): ваша функция, если она будет исправлена, заменит 'a' на 'c', давая "cbccbc", затем 'c' 'a' дает "abaaba". Это не совсем верно!

1 голос
/ 22 июня 2009

Простое решение:

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 является неизменной.

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();
}

Здесь полная строка переворачивается, а затем часть, которая не должна быть обращена, заменяется подстрокой. ;)

1 голос
/ 22 июня 2009

Просто еще один, немного другой подход, так что вы получите представление о спектре возможностей. Я рекомендую вашему вниманию быстрый выход для коротких строк (вместо вложения более сложной обработки в предложении 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));
}
0 голосов
/ 28 августа 2016

Вы можете использовать этот код:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...