Convert string to camel case, CodeWars Kata

사진: 코드워즈

Complete the method/function so that it converts dash/underscore delimited words into camel casing. The first word within the output should be capitalized only if the original word was capitalized (known as Upper Camel Case, also often referred to as Pascal case).

Examples

"the-stealth-warrior"` gets converted to `"theStealthWarrior"`
`"The_Stealth_Warrior"` gets converted to `"TheStealthWarrior"

-또는 _로 구분되어 있는 문자열을 카멜 케이스로 변환하는 문제입니다. 포인트는 첫 번째 단어는 변환하지 않는 것입니다. 입력값의 첫 글자가 소문자로 들어오면 출력값도 소문자여야 합니다.

 

My Solution

저는 먼저 입력 문자열을 정규식[-_]을 이용해 split()해서 배열로 만들었습니다. 그 다음 스트림의 map()을 이용해 변환했습니다. 변환은 substring()을 이용해서 첫 문자만 대문자로 변환하고 이어 붙였습니다. 그런 다음 첫 글자의 대소문자 여부를 처리하기 위해 결괏값의 첫 글자를 입력값의 첫 글자와 바꿔 주었습니다.

솔루션 코드

테스트 코드

package com.codewars;

import java.util.Arrays;

public class ConvertStringToCamelCase {
    public static String toCamelCase(String s) {
        if (s.isEmpty())
            return "";
        String camel = String.join("", Arrays.stream(s.split("[-_]"))
                .map(item -> item.substring(0, 1).toUpperCase() + item.substring(1)).toArray(String[]::new));
        return s.substring(0, 1) + camel.substring(1);
    }
}

 

Best Practice

BP1

자바의 정규식 API를 적극 활용한 케이스입니다. Matcher를 이용해서 구분자 다음 글자를 대문자로 변환했습니다. 이러면 첫 글자에 대한 처리도 별도로 필요 없죠. MatcherStringBuffer 를 이용해 문자열을 변환하고 합치는 패턴은 기억해 둘 만한 것 같습니다.

package com.codewars;

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ConvertStringToCamelCase {
    static String toCamelCase(String s) {
        Matcher m = Pattern.compile("[_|-](\\w)").matcher(s);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            m.appendReplacement(sb, m.group(1).toUpperCase());
        }
        return m.appendTail(sb).toString();
    }
}

 

BP2

두번째는 저의 솔루션과 비슷하지만 Stream을 만들 때 배열을 모두 가져오는 것이 아니라 1번째부터 가져와 첫 번째 단어의 변환을 애초에 하지 않았습니다. 그리고 저는 String.join()을 이용했지만 여기에서는 reduce() 함수에 String.concat()을 이용했습니다.

package com.codewars;

import java.util.Arrays;

public class ConvertStringToCamelCase {
    static String toCamelCase(String str) {
        String[] words = str.split("[-_]");
        return Arrays.stream(words, 1, words.length).map(s -> s.substring(0, 1).toUpperCase() + s.substring(1))
                .reduce(words[0], String::concat);
    }
}

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기