//validates the topic
//replaces all "." by "_"
//ignores everything that is not a letter, a number, "_" or "-"
private static String validateTopic(final String topic) {
final char[] chars = topic.toCharArray();
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < topic.length(); i++) {
final char ch = chars[i];
if (('A' <= ch) && (ch <= 'Z')) {
sb.append(ch);
} else if (('a' <= ch) && (ch <= 'z')) {
sb.append(ch);
} else if (('0' <= ch) && (ch <= '9')) {
sb.append(ch);
} else if ((ch == '_') || (ch == '-')) {
sb.append(ch);
} else if (ch == '.') {
sb.append('_');
}
}
return sb.toString();
}
@Test
public void testValidateTopic() {
assertEquals("this_is_a_valid_topic", Services.validateTopic("this_is_a_valid_topic"));
assertEquals("this-is-also-a-valid-topic", Services.validateTopic("this-is-also-a-valid-topic"));
assertEquals("this_was_a_non_valid_topic", Services.validateTopic("this.was.a.non.valid.topic"));
assertEquals("a-topic-with-a-number4", Services.validateTopic("a-topic-with-a-number4"));
assertEquals("a_mixed-topic_with0different-separators", Services.validateTopic("a_mixed-topic.with0different-separators"));
assertEquals("ExpectedValue", Services.validateTopic("E!x§p$e%c&t/e(d)V=a?l+u#e"));
}
private static final String VALID_TOPIC_REGEX = "[a-zA-z0-9_-]+";
static String validateTopic(final String topic) {
if (isAlreadyValidTopic(topic)) {
return topic;
}
final StringBuilder sb = new StringBuilder();
for (final char c : topic.toCharArray()) {
if (isValidChar(c)) {
sb.append(c);
} else if (c == '.') {
sb.append('_');
}
}
return sb.toString();
}
private static boolean isAlreadyValidTopic(final String topic) {
return topic.matches(VALID_TOPIC_REGEX);
}
private static boolean isValidChar(final char charToCheck) {
if (isUpperCaseChar(charToCheck)) {
return true;
}
if (isLowerCaseChar(charToCheck)) {
return true;
}
if (isNumberChar(charToCheck)) {
return true;
}
if (isUnderscoreOrDash(charToCheck)) {
return true;
}
return false;
}
private static boolean isUpperCaseChar(final char charToCheck) {
return isBeetweenIncluding(charToCheck, 'A', 'Z');
}
private static boolean isLowerCaseChar(final char charToCheck) {
return isBeetweenIncluding(charToCheck, 'a', 'z');
}
private static boolean isNumberChar(final char charToCheck) {
return isBeetweenIncluding(charToCheck, '0', '9');
}
private static boolean isUnderscoreOrDash(final char charToCheck) {
return charToCheck == '_' || charToCheck == '-';
}
private static boolean isBeetweenIncluding(final char charToCheck, final char lowerLimit,
final char upperLimit) {
if (lowerLimit <= charToCheck && charToCheck <= upperLimit) {
return true;
}
return false;
}
ich finde den Methoden-Namen "validateTopic" irgendwie komisch.
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Clean Code Developer" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an clean-code-developer+unsub...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an clean-code-developer@googlegroups.com.
Gruppe besuchen: https://groups.google.com/group/clean-code-developer
Weitere Optionen finden Sie unter https://groups.google.com/d/optout.
--
Sie erhalten diese Nachricht, weil Sie in Google Groups E-Mails von der Gruppe "Clean Code Developer" abonniert haben.
Wenn Sie sich von dieser Gruppe abmelden und keine E-Mails mehr von dieser Gruppe erhalten möchten, senden Sie eine E-Mail an clean-code-devel...@googlegroups.com.
Wenn Sie in dieser Gruppe einen Beitrag posten möchten, senden Sie eine E-Mail an clean-code...@googlegroups.com.
private static final String VALID_TOPIC_REGEX = "[a-zA-z0-9_-]+";
/**
* Takes a topic and normalizes it by replacing all "." with a "_".
* The normalization ignores everything that is not a letter, number, "_" oder "-".
* Therefore everything else will be removed from the given topic.
* @param topic the topic to normalize
* @return a normalized topic with "." replaced by "_" and everything that is not a letter, number, "_" or "-" removed
*/
static String normalizeTopic(final String topic) {
if (topic.matches(VALID_TOPIC_REGEX)) {
return topic;
}
final StringBuilder sb = new StringBuilder();
for (final char c : topic.toCharArray()) {
if (isValidChar(c)) {
sb.append(c);
} else if (c == '.') {
sb.append('_');
}
}
return sb.toString();
}
private static boolean isValidChar(final char charToCheck) {
if (isBeetweenIncluding(charToCheck, 'A', 'Z')) {
return true;
}
if (isBeetweenIncluding(charToCheck, 'a', 'z')) {
return true;
}
if (isBeetweenIncluding(charToCheck, '0', '9')) {
return true;
}
if (charToCheck == '_' || charToCheck == '-') {
return true;
}
return false;
}
private static boolean isBeetweenIncluding(final char charToCheck, final char lowerLimit, final char upperLimit) {
return lowerLimit <= charToCheck && charToCheck <= upperLimit;
}
public static string normalize_topic(string topic) {
topic = Replace_dot(topic);
return Ignore_invalid_chars(topic);
}
private static string Replace_dot(string topic){
return topic.Replace(".", "_");
}
private static string Ignore_invalid_chars(string topic) {
var sb = new StringBuilder();
foreach(var ch in topic)
if (Is_valid_char(ch)) sb.Append(ch);
return sb.ToString();
}
private static bool Is_valid_char(char ch) {
if (('A' <= ch) && (ch <= 'Z')) return true;
if (('a' <= ch) && (ch <= 'z')) return true;
if (('0' <= ch) && (ch <= '9')) return true;
if ((ch == '_') || (ch == '-')) return true;
return false;
}
private static string Ignore_invalid_chars(string topic) {
var validChars = topic.ToCharArray().Where(Is_valid_char);
return new string(validChars.ToArray());
}
public static String normalizeTopic(String topic) {
String replaced = topic.replace(".", "_");
return ingoreInvalidChars(replaced);
}
private static String ingoreInvalidChars(String topic) {
return topic
.chars()
.mapToObj(i -> (char)i)
.filter(Application::isValidChar)
.map(Object::toString)
.collect(Collectors.joining());
}
private static boolean isValidChar(char ch) {
if (('A' <= ch) && (ch <= 'Z')) return true;
if (('a' <= ch) && (ch <= 'z')) return true;
if (('0' <= ch) && (ch <= '9')) return true;
if ((ch == '_') || (ch == '-')) return true;
return false;
}
static String normalizeTopic(final String topic) {
IntStream result = topic.chars() .map(Services::replaceDots) .filter(Services::isValidCharacter);
return collectToString(result);}
private static int replaceDots(int c) {
if (c == '.') {
return '_'; }
return c;}
private static boolean isValidCharacter(int c) { return Character.isLetter(c) || Character.isDigit(c) || c == '_' || c == '-';}
private static String collectToString(final IntStream characterStream) { return characterStream .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString();}
Ich finde, die Lösung stand schon in der ursprünglichen Aufgabe drin. Warum hast du die nicht erhalten?
private static final String VALID_TOPIC_REGEX = "[a-zA-z0-9_-]+";
/**
* Takes a topic and normalizes it by replacing all "." with a "_".
* The normalization ignores everything that is not a letter, number, "_" oder "-".
* Therefore everything else will be removed from the given topic.
* @param topic the topic to normalize
* @return a normalized topic with "." replaced by "_" and everything that is not a letter, number, "_" or "-" removed
*/
static String normalizeTopic(final String topic) {
if (topic.matches(VALID_TOPIC_REGEX)) {
return topic;
}
final String result = topic.replace('.', '_');
final StringBuilder sb = new StringBuilder();
for (final char c : result.toCharArray()) {
if (isValidChar(c)) {
sb.append(c);
}
}
return sb.toString();
}
private static boolean isValidChar(final char charToCheck) {
return Character.isLetter(charToCheck) || Character.isDigit(charToCheck) || charToCheck == '_' || charToCheck == '-';
}