Upload files to "java/wordStat"

This commit is contained in:
2026-04-13 10:41:44 +03:00
parent 51898dd368
commit 8f41006963
5 changed files with 356 additions and 0 deletions

View File

@@ -0,0 +1,183 @@
package wordStat;
import base.*;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
*/
public final class WordStatChecker extends BaseChecker {
public static final String DASH = "-֊־‒–—―⸗⸚⸺〰゠︱︲﹘﹣-'";
public static final String SIMPLE_DELIMITERS = " \t";
public static final String ADVANCED_DELIMITERS =
" \t!\"#%&()*+,./:;<=>?@[\\]^`{|}~ ¡¦§¨©«¬\u00AD®¯°±²³´¶·¸¹»¼½¾¿×÷˂˃˄˅˒˓˔˕˖˗˘˙˚˛˜˝";
public static final String ALL =
ExtendedRandom.RUSSIAN +
ExtendedRandom.ENGLISH +
ExtendedRandom.GREEK +
DASH;
private static final Pattern PATTERN = Pattern.compile(
"[^\\p{IsLetter}'\\p{Pd}]+"
);
public static final Runner.Packages RUNNER = Runner.packages(
"",
"wordstat",
"wspp"
);
private final Function<
String[][],
? extends List<? extends Pair<?, ?>>
> processor;
private final MainChecker main;
private WordStatChecker(
final String className,
final Function<
String[][],
? extends List<? extends Pair<?, ?>>
> processor,
final TestCounter counter
) {
super(counter);
main = new MainChecker(RUNNER.files(className));
this.processor = processor;
}
public static void test(
final TestCounter counter,
final String className,
final Function<
String[][],
? extends List<? extends Pair<?, ?>>
> processor,
final Consumer<WordStatChecker> tests
) {
tests.accept(new WordStatChecker(className, processor, counter));
}
public void test(final String... lines) {
test(PATTERN, lines);
}
public void test(final Pattern pattern, final String... lines) {
final String[][] data = Arrays.stream(lines)
.map(line ->
Arrays.stream(pattern.split(line))
.filter(Predicate.not(String::isEmpty))
.toArray(String[]::new)
)
.toArray(String[][]::new);
test(lines, processor.apply(data));
}
private void randomTest(
final int wordLength,
final int totalWords,
final int wordsPerLine,
final int lines,
final String chars,
final String delimiters,
final Function<String[][], List<? extends Pair<?, ?>>> processor
) {
final String[] words = generateWords(wordLength, totalWords, chars);
final String[][] text = generateTest(lines, words, wordsPerLine);
test(input(text, delimiters), processor.apply(text));
}
public void randomTest(
final int wordLength,
final int totalWords,
final int wordsPerLine,
final int lines,
final String chars,
final String delimiters
) {
randomTest(
wordLength,
totalWords,
wordsPerLine,
lines,
chars,
delimiters,
processor::apply
);
}
private void test(
final String[] text,
final List<? extends Pair<?, ?>> expected
) {
final List<String> expectedList = expected
.stream()
.map(p -> p.first() + " " + p.second())
.collect(Collectors.toList());
main.testEquals(counter, Arrays.asList(text), expectedList);
}
public void test(
final String[][] text,
final String delimiters,
final List<Pair<String, Integer>> answer
) {
test(input(text, delimiters), answer);
}
private String[] generateWords(
final int wordLength,
final int totalWords,
final String chars
) {
final String allChars = chars.chars().anyMatch(Character::isUpperCase)
? chars
: chars + chars.toUpperCase(Locale.ROOT);
return IntStream.range(0, totalWords)
.mapToObj(i ->
random().randomString(allChars, wordLength / 2, wordLength)
)
.toArray(String[]::new);
}
private String[][] generateTest(
final int lines,
final String[] words,
final int wordsPerLine
) {
final String[][] text = new String[lines][];
for (int i = 0; i < text.length; i++) {
text[i] = new String[random().nextInt(
wordsPerLine / 2,
wordsPerLine
)];
for (int j = 0; j < text[i].length; j++) {
text[i][j] = random().randomItem(words);
}
}
return text;
}
private String[] input(final String[][] text, final String delimiters) {
final String[] input = new String[text.length];
for (int i = 0; i < text.length; i++) {
final String[] line = text[i];
final StringBuilder sb = new StringBuilder(
random().randomString(delimiters)
);
for (final String word : line) {
sb.append(word).append(random().randomString(delimiters));
}
input[i] = sb.toString();
}
return input;
}
}