2016-04-18 3 views
-2

Программа, которая берет первые два символа строки и добавляет их в начало и обратно строки. Какая версия лучше?Code Elegance: Java Strings

public String front22(String str) { 
    if(str.length()>2) return str.substring(0,2)+str+str.substring(0,2); 
    return str+str+str; 
} 

или

public String front22(String str) { 
    // First figure the number of chars to take 
    int take = 2; 
    if (take > str.length()) { 
    take = str.length(); 
} 

    String front = str.substring(0, take); 
    return front + str + front; 
} 

Прежние поражает меня как более элегантно. Последнее легче понять. Любые другие предложения по улучшению или более чем приветствуются!

+0

почему 'str.length()> 2'? почему бы не '> ='? –

+0

Я проигнорировал этот вопрос, потому что он не принадлежит StackOverflow. Вы должны удалить это сообщение и повторно опубликовать его в [CodeReview] (http://codereview.stackexchange.com/). –

+0

Если elegance = минимальная длина, я бы использовал регулярное выражение. –

ответ

1

Проблема с первым вариантом, главным образом потому, что string неизменен. [Редактировать.] Как правильно указано @Pshemo, мое утверждение было неясным. Цитирование @Pshemo, "executing same substring twice is inefficient when we can reuse result from first substring".

Использовать StringBuilder.

StringBuilder sb = new StringBuilder(str); 
CharSequence seq = sb.subSequence(0,2); 
sb.insert(0, seq); 
sb.append(seq); 
return sb.toString(); 
+0

@Pshemo не будет подстрокой создать новую строку для java> = 7? –

+0

На самом деле я ошибся в своем первом комментарии. Не обращал внимания на то, что вы использовали 'insert' вместо' append'. Простите за это. Моя точка зрения заключалась в том, что такой код, как 'return str1 + str2 + str3', на самом деле такой же, как' return new StringBuilder (str1) .append (str2) .append (str3) .toString(); '. Также да, подстрока создаст новую String, которая будет содержать локальную копию символов из исходной строки, вместо сохранения ссылки на исходный массив символов. Он был изменен в Java 7, но я не понимаю, как это уместно здесь (если я не понимаю ваш ответ, вы можете его обновить и добавить дополнительные сведения?). – Pshemo

+0

@Pshemo Да, я понял, что вы подумали, что я использовал 'append'. Таким образом, доступ к 'CharSequence', возвращаемый' subSequence', будет, по существу, мягкой копией, которая будет вставлена ​​/ добавлена, вместо создания пучка новых строковых объектов. –