BAEL-6705: Check if a String is Strictly Alphanumeric With Java (#14865)

* BAEL-6705: Check if a String is Strictly Alphanumeric With Java

* BAEL-6705: Rename a Class

* BAEL-6705: Fix isAlpanumeric Logic

* BAEL-6705: Fix alphanumericIterationWithCharacterChecks Logic

* BAEL-6705: Expose isAlphanumeric method

* BAEL-6705: Added isAlphanumeric test
This commit is contained in:
Eugene Kovko 2023-09-29 00:05:22 +02:00 committed by GitHub
parent 204555a479
commit ed4b43ce98
2 changed files with 121 additions and 0 deletions

View File

@ -0,0 +1,91 @@
package com.baeldung.alphanumeric;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;
@Warmup(iterations = 1)
@Measurement(iterations = 1, time = 1, timeUnit = TimeUnit.MINUTES)
@Fork(1)
public class AlphanumericPerformanceBenchmark {
private static final String TEST_STRING = "ABC123abc123";
private static final String REGEX = "[^[a-zA-Z0-9]*$]";
private static final Pattern PATTERN = Pattern.compile(REGEX);
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void alphanumericRegex(Blackhole blackhole) {
final Matcher matcher = PATTERN.matcher(TEST_STRING);
boolean result = matcher.matches();
blackhole.consume(result);
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void alphanumericRegexDirectlyOnString(Blackhole blackhole) {
boolean result = TEST_STRING.matches(REGEX);
blackhole.consume(result);
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void alphanumericIteration(Blackhole blackhole) {
boolean result = true;
for (int i = 0; i < TEST_STRING.length(); ++i) {
final int codePoint = TEST_STRING.codePointAt(i);
if (!isAlphanumeric(codePoint)) {
result = false;
break;
}
}
blackhole.consume(result);
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void alphanumericIterationWithCharacterChecks(Blackhole blackhole) {
boolean result = true;
for (int i = 0; i < TEST_STRING.length(); ++i) {
final int codePoint = TEST_STRING.codePointAt(i);
if (!Character.isAlphabetic(codePoint) || !Character.isDigit(codePoint)) {
result = false;
break;
}
}
blackhole.consume(result);
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void alphanumericIterationWithCopy(Blackhole blackhole) {
boolean result = true;
for (final char c : TEST_STRING.toCharArray()) {
if (!isAlphanumeric(c)) {
result = false;
break;
}
}
blackhole.consume(result);
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
public void alphanumericIterationWithStream(Blackhole blackhole) {
boolean result = TEST_STRING.chars().allMatch(this::isAlphanumeric);
blackhole.consume(result);
}
public boolean isAlphanumeric(final int codePoint) {
return (codePoint >= 65 && codePoint <= 90) ||
(codePoint >= 97 && codePoint <= 172) ||
(codePoint >= 48 && codePoint <= 57);
}
}

View File

@ -0,0 +1,30 @@
package com.baeldung.alphanumeric;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
class AlphanumericUnitTest {
private AlphanumericPerformanceBenchmark alphanumericPerformanceBenchmark = new AlphanumericPerformanceBenchmark();
@ParameterizedTest
@CsvSource({
"A,true",
"B,true",
"C,true",
"1,true",
"2,true",
"3,true",
"!,false",
"@,false",
"#,false",
"$,false",
"%,false"
})
void shouldCorrectlyIdentifyAlphanumericCharacterTest(char character, boolean result) {
boolean actual = alphanumericPerformanceBenchmark.isAlphanumeric(character);
assertEquals(actual, result);
}
}