Як використовувати великі літери першого слова в рядку


421

Чи існує вбудована в Java функція, яка використовує великі літери кожного слова в рядку і не впливає на інші?

Приклади:

  • jon skeet -> Jon Skeet
  • miles o'Brien-> Miles O'Brien(B залишається капіталом, це виключає назву справи)
  • old mcdonald-> Old Mcdonald*

* ( Old McDonaldзнайдеться теж, але я не очікую, що це БУДЬ розумно.)

Швидкий погляд на документацію струнної документації Java виявляє лише toUpperCase()і toLowerCase(), що, звичайно, не забезпечує бажаної поведінки. Природно, в результатах Google переважають ці дві функції. Здається, що колесо, яке, мабуть, вже було винайдено, тому запитати його не завадило, і я можу ним скористатися в майбутньому.


18
Про що old mcdonald? Це повинно стати Old McDonald?
Барт Кірс

2
Я не очікую, що функція буде такою розумною. (Хоча якщо у вас є такий, я був би радий його побачити.) Просто вставте першу букву після пробілу, але проігноруйте решту.
WillfulWizard


1
Ви б не змогли знайти алгоритм, який належним чином обробляє написання імен після факту так чи інакше ... доки є пари імен, яке може бути правильним для даної людини, як-от MacDonald і Macdonald, функція буде не мають можливості знати, що було правильно. Краще робити те, що ти зробив, хоча ти все-таки помилишся деякі імена (наприклад, фон Нойман).
Дейв ДуПлантіс

Спробуйте Burger King ...
Magno C

Відповіді:


732

WordUtils.capitalize(str)апаш-commons-text )

(Примітка: якщо вам потрібно "fOO BAr"стати "Foo Bar", тоді використовуйте capitalizeFully(..)замість цього)


5
Я думаю, ти маєш на увазі WordUtils.capitalize (str). Докладніше див. API.
Ганс Догген

84
Зберігаю мою філософію завжди голосувати відповіді, які стосуються бібліотек спільноти.
Раві Валлау

11
Щоб змінити не першу літеру слів на малі, використовуйте великі літери (str).
Умеш Раджбхандарі

5
Це рішення справді правильне ? це не на мій погляд! Якщо ви хочете використовувати великі літери "LAMborghini", ви хочете, нарешті, "Lamborghini". Так і WordUtils.capitalizeFully(str)є рішення.
basZero

3
@BasZero - це правильна відповідь на поставлене питання. Я включу повністю коментар як коментар.
Божо

229

Якщо ви переживаєте лише за те, що перша літера першого слова буде написана з великої літери:

private String capitalize(final String line) {
   return Character.toUpperCase(line.charAt(0)) + line.substring(1);
}

3
це лише змінює першу букву першого слова
Chrizzz

28
Дійсно, це був мій намір.
Нік Болтон

13
@nbolton - Але він явно ігнорує наміри питання і не відповідає самим випадкам, наведеним у цьому прикладі, - і це додає мало або нічого до попередньо наданих відповідей!
Девід Манхайм

17
Цей фрагмент коду не є безпечним для збоїв! Уявіть, lineщо це недійсне чи має довжину <2.
stk

1
все-таки поверніться Character.toUpperCase (word.charAt (0)) + word.substring (1) .toLowerCase ()
крім Exceptyon

72

Наступний метод перетворює всі літери у великі / малі регістри, залежно від їх положення біля пробілу чи інших спеціальних символів.

public static String capitalizeString(String string) {
  char[] chars = string.toLowerCase().toCharArray();
  boolean found = false;
  for (int i = 0; i < chars.length; i++) {
    if (!found && Character.isLetter(chars[i])) {
      chars[i] = Character.toUpperCase(chars[i]);
      found = true;
    } else if (Character.isWhitespace(chars[i]) || chars[i]=='.' || chars[i]=='\'') { // You can add other chars here
      found = false;
    }
  }
  return String.valueOf(chars);
}

Я хотів би поліпшити і спростити умова циклу: if(Character.isLetter(chars[i])) { if(!found) { chars[i] = Character.toUpperCase(chars[i]); } found = true; } else { found = false; }.
bancer

@bancer, у вашому прикладі ви не можете контролювати, за якими символами не буде просте велика літера.
Справжній м'який

@TrueSoft, я тебе не розумію. Чому потрібно контролювати, які символи слід після великої літери? Як я зрозумів, важливо, щоб попередній символ не був буквою, і мій приклад цього забезпечує. Просто замініть ваш блок if-else-if на мій блок if-else і запустіть тест.
bancer

@TrueSoft, для ясності я б перейменувати foundв previousCharIsLetter.
bancer

9
Мені подобається мати відповіді, які не використовують бібліотеку спільнот, тому що раз у раз ви не можете її використовувати.
Гекман

38

Спробуйте цей дуже простий спосіб

example GivenString = "Овен хороший хлопчик"

public static String toTitleCase(String givenString) {
    String[] arr = givenString.split(" ");
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < arr.length; i++) {
        sb.append(Character.toUpperCase(arr[i].charAt(0)))
            .append(arr[i].substring(1)).append(" ");
    }          
    return sb.toString().trim();
}  

Вихід буде: Ram Is Good Boy


1
цей код спричинив збій нашого сервера: java.lang.StringIndexOutOfBoundsException: Індекс рядків поза діапазоном: 0
Chrizzz

32
@Chrizzz, тому не вводите код, який ви не тестували ... Якщо ви надасте порожню рядок, вона завершиться збоєм. Ваша вина, а не Нілама.
Рейнхерд

1
Якщо в кінці є пробіл, то він руйнується, тоді я додав спочатку trim () і розділив рядок з пробілом. Він прекрасно працював
Хануман

Якщо хтось шукає свою версію
Помилки трапляються

16

Я написав невеликий клас, щоб виписати великі слова з усіх слів у рядку.

Необов'язково multiple delimiters, кожен з яких має свою поведінку (використовуйте великі літери до, після або обох для обробки подібних випадків O'Brian);

Необов’язково Locale;

Не зривайтесь Surrogate Pairs.

LIVE DEMO

Вихід:

====================================
 SIMPLE USAGE
====================================
Source: cApItAlIzE this string after WHITE SPACES
Output: Capitalize This String After White Spaces

====================================
 SINGLE CUSTOM-DELIMITER USAGE
====================================
Source: capitalize this string ONLY before'and''after'''APEX
Output: Capitalize this string only beforE'AnD''AfteR'''Apex

====================================
 MULTIPLE CUSTOM-DELIMITER USAGE
====================================
Source: capitalize this string AFTER SPACES, BEFORE'APEX, and #AFTER AND BEFORE# NUMBER SIGN (#)
Output: Capitalize This String After Spaces, BeforE'apex, And #After And BeforE# Number Sign (#)

====================================
 SIMPLE USAGE WITH CUSTOM LOCALE
====================================
Source: Uniforming the first and last vowels (different kind of 'i's) of the Turkish word D[İ]YARBAK[I]R (DİYARBAKIR) 
Output: Uniforming The First And Last Vowels (different Kind Of 'i's) Of The Turkish Word D[i]yarbak[i]r (diyarbakir) 

====================================
 SIMPLE USAGE WITH A SURROGATE PAIR 
====================================
Source: ab 𐐂c de à
Output: Ab 𐐪c De À

Примітка: перший лист завжди буде з великої літери (відредагуйте джерело, якщо цього не хочете).

Будь ласка, поділіться своїми коментарями та допоможіть мені знайти помилки або покращити код ...

Код:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class WordsCapitalizer {

    public static String capitalizeEveryWord(String source) {
        return capitalizeEveryWord(source,null,null);
    }

    public static String capitalizeEveryWord(String source, Locale locale) {
        return capitalizeEveryWord(source,null,locale);
    }

    public static String capitalizeEveryWord(String source, List<Delimiter> delimiters, Locale locale) {
        char[] chars; 

        if (delimiters == null || delimiters.size() == 0)
            delimiters = getDefaultDelimiters();                

        // If Locale specified, i18n toLowerCase is executed, to handle specific behaviors (eg. Turkish dotted and dotless 'i')
        if (locale!=null)
            chars = source.toLowerCase(locale).toCharArray();
        else 
            chars = source.toLowerCase().toCharArray();

        // First charachter ALWAYS capitalized, if it is a Letter.
        if (chars.length>0 && Character.isLetter(chars[0]) && !isSurrogate(chars[0])){
            chars[0] = Character.toUpperCase(chars[0]);
        }

        for (int i = 0; i < chars.length; i++) {
            if (!isSurrogate(chars[i]) && !Character.isLetter(chars[i])) {
                // Current char is not a Letter; gonna check if it is a delimitrer.
                for (Delimiter delimiter : delimiters){
                    if (delimiter.getDelimiter()==chars[i]){
                        // Delimiter found, applying rules...                       
                        if (delimiter.capitalizeBefore() && i>0 
                            && Character.isLetter(chars[i-1]) && !isSurrogate(chars[i-1]))
                        {   // previous character is a Letter and I have to capitalize it
                            chars[i-1] = Character.toUpperCase(chars[i-1]);
                        }
                        if (delimiter.capitalizeAfter() && i<chars.length-1 
                            && Character.isLetter(chars[i+1]) && !isSurrogate(chars[i+1]))
                        {   // next character is a Letter and I have to capitalize it
                            chars[i+1] = Character.toUpperCase(chars[i+1]);
                        }
                        break;
                    }
                } 
            }
        }
        return String.valueOf(chars);
    }


    private static boolean isSurrogate(char chr){
        // Check if the current character is part of an UTF-16 Surrogate Pair.  
        // Note: not validating the pair, just used to bypass (any found part of) it.
        return (Character.isHighSurrogate(chr) || Character.isLowSurrogate(chr));
    }       

    private static List<Delimiter> getDefaultDelimiters(){
        // If no delimiter specified, "Capitalize after space" rule is set by default. 
        List<Delimiter> delimiters = new ArrayList<Delimiter>();
        delimiters.add(new Delimiter(Behavior.CAPITALIZE_AFTER_MARKER, ' '));
        return delimiters;
    } 

    public static class Delimiter {
        private Behavior behavior;
        private char delimiter;

        public Delimiter(Behavior behavior, char delimiter) {
            super();
            this.behavior = behavior;
            this.delimiter = delimiter;
        }

        public boolean capitalizeBefore(){
            return (behavior.equals(Behavior.CAPITALIZE_BEFORE_MARKER)
                    || behavior.equals(Behavior.CAPITALIZE_BEFORE_AND_AFTER_MARKER));
        }

        public boolean capitalizeAfter(){
            return (behavior.equals(Behavior.CAPITALIZE_AFTER_MARKER)
                    || behavior.equals(Behavior.CAPITALIZE_BEFORE_AND_AFTER_MARKER));
        }

        public char getDelimiter() {
            return delimiter;
        }
    }

    public static enum Behavior {
        CAPITALIZE_AFTER_MARKER(0),
        CAPITALIZE_BEFORE_MARKER(1),
        CAPITALIZE_BEFORE_AND_AFTER_MARKER(2);                      

        private int value;          

        private Behavior(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }           
    } 

15
String toBeCapped = "i want this sentence capitalized";

String[] tokens = toBeCapped.split("\\s");
toBeCapped = "";

for(int i = 0; i < tokens.length; i++){
    char capLetter = Character.toUpperCase(tokens[i].charAt(0));
    toBeCapped +=  " " + capLetter + tokens[i].substring(1);
}
toBeCapped = toBeCapped.trim();

1
Хммм, я думаю, що другий рядок у циклі for повинен читати: toBeCapped + = "" + capLetter + лексеми [i] .substring (1, лексеми [i] .length ());
jengelsma

1
Але це рішення додасть пробілу на старті. Тому вам може знадобитися зробити обробку зліва.
Kamalakannan J

13

Я зробив рішення в Java 8, яке IMHO читабельніше.

public String firstLetterCapitalWithSingleSpace(final String words) {
    return Stream.of(words.trim().split("\\s"))
    .filter(word -> word.length() > 0)
    .map(word -> word.substring(0, 1).toUpperCase() + word.substring(1))
    .collect(Collectors.joining(" "));
}

Істину цього рішення можна знайти тут: https://gist.github.com/Hylke1982/166a792313c5e2df9d31


10

Використання org.apache.commons.lang.StringUtilsробить це дуже простим.

capitalizeStr = StringUtils.capitalize(str);

2
@Ash StringUtils.capitalise(str)застаріло. Дивіться: commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/…
Navigatron

Це лише з великої літери використовує перший символ рядка, а не перший символ кожного слова в рядку. WordUtils застарілий лише тому, що він перемістився з commons lang до commons text commons.apache.org/proper/commons-text/javadocs/api-release/org/…
opticyclic

Недобра ідея використовувати зовнішню бібліотеку для невеликих завдань.
Переповнення стека

7

За допомогою цього простого коду :

String example="hello";

example=example.substring(0,1).toUpperCase()+example.substring(1, example.length());

System.out.println(example);

Результат: Привіт


6
про HELLO він повертає HELLO, але очікуємо Привіт, тому ви будете використовувати toLowerCase () у другій SubString
Trikaldarshi

5

Я використовую наступну функцію. Я думаю, що це швидше у виконанні.

public static String capitalize(String text){
    String c = (text != null)? text.trim() : "";
    String[] words = c.split(" ");
    String result = "";
    for(String w : words){
        result += (w.length() > 1? w.substring(0, 1).toUpperCase(Locale.US) + w.substring(1, w.length()).toLowerCase(Locale.US) : w) + " ";
    }
    return result.trim();
}

3
Завжди використовуйте StringBuilder, коли ви збираєтесь, а не + =
читгокс

2
Чому ти вважаєш, що це швидше?
Пітер Мортенсен

5

З Java 9+

ви можете використовувати String::replaceAllтак:

public static void upperCaseAllFirstCharacter(String text) {
    String regex = "\\b(.)(.*?)\\b";
    String result = Pattern.compile(regex).matcher(text).replaceAll(
            matche -> matche.group(1).toUpperCase() + matche.group(2)
    );

    System.out.println(result);
}

Приклад:

upperCaseAllFirstCharacter("hello this is Just a test");

Виходи

Hello This Is Just A Test

4

Використовуйте метод Спліт, щоб розділити рядок на слова, а потім скористайтеся вбудованими рядковими функціями для використання великих літер, а потім додайте разом.

Псевдо-код (ish)

string = "the sentence you want to apply caps to";
words = string.split(" ") 
string = ""
for(String w: words)

//This line is an easy way to capitalize a word
    word = word.toUpperCase().replace(word.substring(1), word.substring(1).toLowerCase())

    string += word

Зрештою, рядок виглядає приблизно як "Вирок, до якого ви хочете застосувати шапки"


4

Це може бути корисно, якщо вам потрібно використовувати великі літери. Він використовує великі літери кожної підрядки з обмеженням, за " "винятком вказаних рядків, таких як "a"або "the". Я ще не керував цим, тому що пізно, хоч все добре. Використовує Apache Commons StringUtils.join()в одному пункті. Ви можете замінити його простим циклом, якщо бажаєте.

private static String capitalize(String string) {
    if (string == null) return null;
    String[] wordArray = string.split(" "); // Split string to analyze word by word.
    int i = 0;
lowercase:
    for (String word : wordArray) {
        if (word != wordArray[0]) { // First word always in capital
            String [] lowercaseWords = {"a", "an", "as", "and", "although", "at", "because", "but", "by", "for", "in", "nor", "of", "on", "or", "so", "the", "to", "up", "yet"};
            for (String word2 : lowercaseWords) {
                if (word.equals(word2)) {
                    wordArray[i] = word;
                    i++;
                    continue lowercase;
                }
            }
        }
        char[] characterArray = word.toCharArray();
        characterArray[0] = Character.toTitleCase(characterArray[0]);
        wordArray[i] = new String(characterArray);
        i++;
    }
    return StringUtils.join(wordArray, " "); // Re-join string
}

Перерви, якщо в рядку є подвійні пробіли, що є німим для введення, але FYI.
JustTrying

4
public static String toTitleCase(String word){
    return Character.toUpperCase(word.charAt(0)) + word.substring(1);
}

public static void main(String[] args){
    String phrase = "this is to be title cased";
    String[] splitPhrase = phrase.split(" ");
    String result = "";

    for(String word: splitPhrase){
        result += toTitleCase(word) + " ";
    }
    System.out.println(result.trim());
}

Ласкаво просимо до переповнення стека! Як правило, відповіді набагато корисніші, якщо вони включають пояснення того, що призначений для виконання коду та чому це вирішує проблему, не вводячи інших.
Нейрон

Найпросте рішення на сьогоднішній день і уникає використання зовнішніх
ліб

3
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   

System.out.println("Enter the sentence : ");

try
{
    String str = br.readLine();
    char[] str1 = new char[str.length()];

    for(int i=0; i<str.length(); i++)
    {
        str1[i] = Character.toLowerCase(str.charAt(i));
    }

    str1[0] = Character.toUpperCase(str1[0]);
    for(int i=0;i<str.length();i++)
    {
        if(str1[i] == ' ')
        {                   
            str1[i+1] =  Character.toUpperCase(str1[i+1]);
        }
        System.out.print(str1[i]);
    }
}
catch(Exception e)
{
    System.err.println("Error: " + e.getMessage());
}

Це найпростіша, основна і найкраща відповідь для такого новачка, як я!
abhishah901

3

Я вирішив додати ще одне рішення для написання великих літер у рядку:

  • слова тут визначаються як суміжні букви або цифри;
  • надаються також сурогатні пари;
  • код оптимізований для продуктивності; і
  • вона все ще компактна.

Функція:

public static String capitalize(String string) {
  final int sl = string.length();
  final StringBuilder sb = new StringBuilder(sl);
  boolean lod = false;
  for(int s = 0; s < sl; s++) {
    final int cp = string.codePointAt(s);
    sb.appendCodePoint(lod ? Character.toLowerCase(cp) : Character.toUpperCase(cp));
    lod = Character.isLetterOrDigit(cp);
    if(!Character.isBmpCodePoint(cp)) s++;
  }
  return sb.toString();
}

Приклад виклику:

System.out.println(capitalize("An à la carte StRiNg. Surrogate pairs: 𐐪𐐪."));

Результат:

An À La Carte String. Surrogate Pairs: 𐐂𐐪.

3

Використання:

    String text = "jon skeet, miles o'brien, old mcdonald";

    Pattern pattern = Pattern.compile("\\b([a-z])([\\w]*)");
    Matcher matcher = pattern.matcher(text);
    StringBuffer buffer = new StringBuffer();
    while (matcher.find()) {
        matcher.appendReplacement(buffer, matcher.group(1).toUpperCase() + matcher.group(2));
    }
    String capitalized = matcher.appendTail(buffer).toString();
    System.out.println(capitalized);

Відмінно працює з toLowerCase -> "Matcher matcher = pattern.matcher (text.toLowerCase ());" (Для вхідного тексту типу "JOHN DOE")
smillien62

3

Існує багато способів перетворення першої літери першого слова з великої літери. У мене є ідея. Це дуже просто:

public String capitalize(String str){

     /* The first thing we do is remove whitespace from string */
     String c = str.replaceAll("\\s+", " ");
     String s = c.trim();
     String l = "";

     for(int i = 0; i < s.length(); i++){
          if(i == 0){                              /* Uppercase the first letter in strings */
              l += s.toUpperCase().charAt(i);
              i++;                                 /* To i = i + 1 because we don't need to add               
                                                    value i = 0 into string l */
          }

          l += s.charAt(i);

          if(s.charAt(i) == 32){                   /* If we meet whitespace (32 in ASCII Code is whitespace) */
              l += s.toUpperCase().charAt(i+1);    /* Uppercase the letter after whitespace */
              i++;                                 /* Yo i = i + 1 because we don't need to add
                                                   value whitespace into string l */
          }        
     }
     return l;
}

Дякуємо за спробу додати відповідь. Це розумна ідея, але зауважте, що є основні функції, які вже роблять це, і код, який робить це аналогічно тому, що ви надали, і прийняті відповіді вже чітко окреслюють їх усі.
Девід Мангейм

2
  package com.test;

 /**
   * @author Prasanth Pillai
   * @date 01-Feb-2012
   * @description : Below is the test class details
   * 
   * inputs a String from a user. Expect the String to contain spaces and    alphanumeric     characters only.
   * capitalizes all first letters of the words in the given String.
   * preserves all other characters (including spaces) in the String.
   * displays the result to the user.
   * 
   * Approach : I have followed a simple approach. However there are many string    utilities available 
   * for the same purpose. Example : WordUtils.capitalize(str) (from apache commons-lang)
   *
   */
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;

  public class Test {

public static void main(String[] args) throws IOException{
    System.out.println("Input String :\n");
    InputStreamReader converter = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(converter);
    String inputString = in.readLine();
    int length = inputString.length();
    StringBuffer newStr = new StringBuffer(0);
    int i = 0;
    int k = 0;
    /* This is a simple approach
     * step 1: scan through the input string
     * step 2: capitalize the first letter of each word in string
     * The integer k, is used as a value to determine whether the 
     * letter is the first letter in each word in the string.
     */

    while( i < length){
        if (Character.isLetter(inputString.charAt(i))){
            if ( k == 0){
            newStr = newStr.append(Character.toUpperCase(inputString.charAt(i)));
            k = 2;
            }//this else loop is to avoid repeatation of the first letter in output string 
            else {
            newStr = newStr.append(inputString.charAt(i));
            }
        } // for the letters which are not first letter, simply append to the output string. 
        else {
            newStr = newStr.append(inputString.charAt(i));
            k=0;
        }
        i+=1;           
    }
    System.out.println("new String ->"+newStr);
    }
}

2

Ось проста функція

public static String capEachWord(String source){
    String result = "";
    String[] splitString = source.split(" ");
    for(String target : splitString){
        result += Character.toUpperCase(target.charAt(0))
                + target.substring(1) + " ";
    }
    return result.trim();
}

1
Не використовуйте рядкове скорочення для створення довгих рядків, болісно повільно: stackoverflow.com/questions/15177987/…
Лукас Кнут

2

Це лише інший спосіб зробити це:

private String capitalize(String line)
{
    StringTokenizer token =new StringTokenizer(line);
    String CapLine="";
    while(token.hasMoreTokens())
    {
        String tok = token.nextToken().toString();
        CapLine += Character.toUpperCase(tok.charAt(0))+ tok.substring(1)+" ";        
    }
    return CapLine.substring(0,CapLine.length()-1);
}

2

Метод багаторазового використання для intiCap:

    public class YarlagaddaSireeshTest{

    public static void main(String[] args) {
        String FinalStringIs = "";
        String testNames = "sireesh yarlagadda test";
        String[] name = testNames.split("\\s");

        for(String nameIs :name){
            FinalStringIs += getIntiCapString(nameIs) + ",";
        }
        System.out.println("Final Result "+ FinalStringIs);
    }

    public static String getIntiCapString(String param) {
        if(param != null && param.length()>0){          
            char[] charArray = param.toCharArray(); 
            charArray[0] = Character.toUpperCase(charArray[0]); 
            return new String(charArray); 
        }
        else {
            return "";
        }
    }
}

2

Ось моє рішення.

Я зіткнувся з цією проблемою сьогодні ввечері і вирішив її пошукати. Я знайшов відповідь Нілама Сінга, яка майже там була, тому я вирішив виправити проблему (зламався на порожніх рядках) і спричинив збій у системі.

Метод, який ви шукаєте, названий capString(String s)нижче. Це перетворюється "Це лише 5 ранку" у "Тут лише 5 ранку".

Код досить добре прокоментований, тому насолоджуйтесь.

package com.lincolnwdaniel.interactivestory.model;

    public class StringS {

    /**
     * @param s is a string of any length, ideally only one word
     * @return a capitalized string.
     * only the first letter of the string is made to uppercase
     */
    public static String capSingleWord(String s) {
        if(s.isEmpty() || s.length()<2) {
            return Character.toUpperCase(s.charAt(0))+"";
        } 
        else {
            return Character.toUpperCase(s.charAt(0)) + s.substring(1);
        }
    }

    /**
     *
     * @param s is a string of any length
     * @return a title cased string.
     * All first letter of each word is made to uppercase
     */
    public static String capString(String s) {
        // Check if the string is empty, if it is, return it immediately
        if(s.isEmpty()){
            return s;
        }

        // Split string on space and create array of words
        String[] arr = s.split(" ");
        // Create a string buffer to hold the new capitalized string
        StringBuffer sb = new StringBuffer();

        // Check if the array is empty (would be caused by the passage of s as an empty string [i.g "" or " "],
        // If it is, return the original string immediately
        if( arr.length < 1 ){
            return s;
        }

        for (int i = 0; i < arr.length; i++) {
            sb.append(Character.toUpperCase(arr[i].charAt(0)))
                    .append(arr[i].substring(1)).append(" ");
        }
        return sb.toString().trim();
    }
}

2

1. Java 8 потоків

public static String capitalizeAll(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }

    return Arrays.stream(str.split("\\s+"))
            .map(t -> t.substring(0, 1).toUpperCase() + t.substring(1))
            .collect(Collectors.joining(" "));
}

Приклади:

System.out.println(capitalizeAll("jon skeet")); // Jon Skeet
System.out.println(capitalizeAll("miles o'Brien")); // Miles O'Brien
System.out.println(capitalizeAll("old mcdonald")); // Old Mcdonald
System.out.println(capitalizeAll(null)); // null

Для foo bARщоб Foo Barзамінити map()метод про таке:

.map(t -> t.substring(0, 1).toUpperCase() + t.substring(1).toLowerCase())

2. String.replaceAll()(Java 9+)

ublic static String capitalizeAll(String str) {
    if (str == null || str.isEmpty()) {
        return str;
    }

    return Pattern.compile("\\b(.)(.*?)\\b")
            .matcher(str)
            .replaceAll(match -> match.group(1).toUpperCase() + match.group(2));
}

Приклади:

System.out.println(capitalizeAll("12 ways to learn java")); // 12 Ways To Learn Java
System.out.println(capitalizeAll("i am atta")); // I Am Atta
System.out.println(capitalizeAll(null)); // null

3. Текст Apache Commons

System.out.println(WordUtils.capitalize("love is everywhere")); // Love Is Everywhere
System.out.println(WordUtils.capitalize("sky, sky, blue sky!")); // Sky, Sky, Blue Sky!
System.out.println(WordUtils.capitalize(null)); // null

Для заголовка:

System.out.println(WordUtils.capitalizeFully("fOO bAR")); // Foo Bar
System.out.println(WordUtils.capitalizeFully("sKy is BLUE!")); // Sky Is Blue!

Для детальної інформації ознайомтесь із цим підручником .




1
package corejava.string.intern;

import java.io.DataInputStream;

import java.util.ArrayList;

/*
 * wap to accept only 3 sentences and convert first character of each word into upper case
 */

public class Accept3Lines_FirstCharUppercase {

    static String line;
    static String words[];
    static ArrayList<String> list=new ArrayList<String>();

    /**
     * @param args
     */
    public static void main(String[] args) throws java.lang.Exception{

        DataInputStream read=new DataInputStream(System.in);
        System.out.println("Enter only three sentences");
        int i=0;
        while((line=read.readLine())!=null){
            method(line);       //main logic of the code
            if((i++)==2){
                break;
            }
        }
        display();
        System.out.println("\n End of the program");

    }

    /*
     * this will display all the elements in an array
     */
    public static void display(){
        for(String display:list){
            System.out.println(display);
        }
    }

    /*
     * this divide the line of string into words 
     * and first char of the each word is converted to upper case
     * and to an array list
     */
    public static void method(String lineParam){
        words=line.split("\\s");
        for(String s:words){
            String result=s.substring(0,1).toUpperCase()+s.substring(1);
            list.add(result);
        }
    }

}

1

Якщо ви віддаєте перевагу Гуаві ...

String myString = ...;

String capWords = Joiner.on(' ').join(Iterables.transform(Splitter.on(' ').omitEmptyStrings().split(myString), new Function<String, String>() {
    public String apply(String input) {
        return Character.toUpperCase(input.charAt(0)) + input.substring(1);
    }
}));

1
String toUpperCaseFirstLetterOnly(String str) {
    String[] words = str.split(" ");
    StringBuilder ret = new StringBuilder();
    for(int i = 0; i < words.length; i++) {
        ret.append(Character.toUpperCase(words[i].charAt(0)));
        ret.append(words[i].substring(1));
        if(i < words.length - 1) {
            ret.append(' ');
        }
    }
    return ret.toString();
}

1

Короткий і точний спосіб полягає в наступному:

String name = "test";

name = (name.length() != 0) ?name.toString().toLowerCase().substring(0,1).toUpperCase().concat(name.substring(1)): name;
--------------------
Output
--------------------
Test
T 
empty
--------------------

Він працює без помилок, якщо ви спробуєте змінити значення імені на три значення. Помилка.


Що робити, якщо це більше ніж одне слово
luckyguy73
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.