https://www.codewars.com/kata/51c8e37cee245da6b40000bd/java
Codewars: Train your coding skills
Codewars is where developers achieve code mastery through challenge. Train on kata in the dojo and reach your highest potential.
www.codewars.com
Complete the solution so that it strips all text that follows any of a set of comment markers passed in. Any whitespace at the end of the line should also be stripped out.
1. Example:
Given an input string of:
<java />apples, pears # and bananas grapes bananas !apples
The output expected would be:
<java />apples, pears grapes bananas
The code would be called like so:
<java />
var result = solution("apples, pears # and bananas\ngrapes\nbananas !apples", ["#", "!"])
// result should == "apples, pears\ngrapes\nbananas"
2. Solution
<java />
import java.util.ArrayList;
public class StripComments {
public static String stripComments(String text, String[] commentSymbols) {
StringBuilder text1 = new StringBuilder();
ArrayList<String> list = editString(text);
for(String line:list) {
text1.append(removeString(line, commentSymbols)).append("\n");
}
text1.deleteCharAt(text1.length()-1);
if(SpaceAll(text1)) { return ""; }
return text1.toString();
}
private static ArrayList<String> editString(String text) {
StringBuilder text2 = new StringBuilder(text);
ArrayList<String> result = new ArrayList<>();
int index;
for(int i=0; i<=result.size(); i++) {
index = text2.indexOf("\n");
if(index == -1) { break; }
result.add(text2.substring(0, index));
text2.delete(0, index+1);
}
result.add(text2.toString());
System.out.println(result);
return result;
}
private static Object removeString(String line, String[] commentSymbols) {
StringBuilder result2 = new StringBuilder();
char checkchar;
boolean checking = true;
for(int i=0; i<line.length(); i++) {
checkchar = line.charAt(i);
for(int j=0; j<commentSymbols.length; j++) {
if( checkchar == commentSymbols[j].charAt(0)) {
checking = false;
break;
}
}
if(checking) { result2.append(checkchar); }
else break;
}
if(result2.length() != 0 && result2.charAt(result2.length()-1) == ' ') {
result2.deleteCharAt(result2.length()-1);
}
return result2;
}
private static boolean SpaceAll(StringBuilder text){
int count = 0;
for(int i=0; i<text.length(); i++){
if(text.charAt(i) == ' ') { count++; }
}
if(count==text.length()) { return true; }
return false;
}
}
빈 공간이 생기는 문제가 조금 귀찮았다
3.
4. Best Solution
<java />
import java.util.Arrays;
import java.util.stream.Collectors;
public class StripComments {
public static String stripComments(String text, String[] symbols) {
return Arrays.stream(text.split("\n")).map(s -> {
for (String symbol : symbols) s = s.replaceAll("(\\s+$)|(\\s*[" + symbol + "].*)", "");
return s;
}).collect(Collectors.joining("\n"));
}
}
: Stream과 정규 표현식을 이용해서 간단하게 해결함