import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public final class HexWords { public static void main(String[] aArgs) throws IOException { Set hexDigits = Set.of( 'a', 'b', 'c', 'd', 'e', 'f' ); List items = Files.lines(Path.of("unixdict.txt")) .filter( word -> word.length() >= 4 ) .filter( word -> word.chars().allMatch( ch -> hexDigits.contains((char) ch) ) ) .map( word -> { final int value = Integer.parseInt(word, 16); return new Item(word, value, digitalRoot(value)); } ) .collect(Collectors.toList()); Collections.sort(items, Comparator.comparing(Item::getDigitalRoot).thenComparing(Item::getWord)); display(items); List filteredItems = items.stream() .filter( item -> item.aWord.chars().mapToObj( ch -> (char) ch ).collect(Collectors.toSet()).size() >= 4 ) .collect(Collectors.toList()); Collections.sort(filteredItems, Comparator.comparing(Item::getNumber).reversed()); display(filteredItems); } private static int digitalRoot(int aNumber) { int result = 0; while ( aNumber > 0 ) { result += aNumber % 10; aNumber /= 10; } return ( result <= 9 ) ? result : digitalRoot(result); } private static void display(List aItems) { System.out.println(" Word Decimal value Digital root"); System.out.println("----------------------------------------"); for ( Item item : aItems ) { System.out.println(String.format("%7s%15d%12d", item.aWord, item.aNumber, item.aDigitalRoot)); } System.out.println(System.lineSeparator() + "Total count: " + aItems.size() + System.lineSeparator()); } private static record Item(String aWord, int aNumber, int aDigitalRoot) { public String getWord() { return aWord; } public int getNumber() { return aNumber; } public int getDigitalRoot() { return aDigitalRoot; } } }