>>101436508
Definitely.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
public class CommonWordPrinter {
public static void main(String[] args) {
// Print the N most common strings in a given list of strings.
List<String> list = Arrays.asList(
"apple", "orange", "banana", "pear",
"apple", "orange", "banana",
"apple", "orange",
"apple"
);
for(String word : getMostCommonWordsIn(list, 3))
System.out.println(word);
}
static List<String> getMostCommonWordsIn(List<String> list, int limit) {
return list.stream()
.collect(groupingBy(identity(), counting()))
.entrySet()
.stream()
.sorted((a, b) -> -Long.compare(a.getValue(), b.getValue()))
.limit(limit)
.map(Map.Entry::getKey)
.collect(toList());
}
}
with a test:
import java.util.Arrays;
import static java.util.stream.Collectors.joining;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class CommonWordPrinterTest {
@ParameterizedTest
@CsvSource({
"'apple,orange,banana,pear,apple,orange,banana,apple,orange,apple', 3, 'apple,orange,banana'"
})
public void shouldGetMostCommonWords(String intialCsv, int limit, String expectedCsv) {
assertEquals(
expectedCsv,
CommonWordPrinter.getMostCommonWordsIn(Arrays.asList(intialCsv.split(",")), limit)
.stream()
.collect(joining(","))
);
}
}
but for beginner code, his is not too shabby.