Как вернуть список самых высоких анаграмм в массиве? - PullRequest
2 голосов
/ 29 сентября 2019

У меня есть вопрос о том, как вернуть список отсортированных анаграмм, которые размещены рядом в индексах одного массива. Чтобы уточнить это:

Array sortedAnagrams:sortedAnagrams [0] = aspsortedAnagrams [1] = passortedAnagrams [2] = кодsortedAnagrams [3] = coedsortedAnagrams [4] = декоsortedAnagrams [5] = Франция

Из этого примера ясно, что мои индексы "2", "3" и "4" имеют самую высокую встречающуюся анаграмму. Как мне написать метод, в котором я могу сказать, что эти индексы содержат самую высокую встречающуюся анаграмму?

Я начал это делать, но не знаю, как это должно продолжаться.

public static String[] getLargestAnagramGroup(String[] stringList){

    for (int i = 0; i < stringList.length; i++) {
        int j = i + 1;
        if (AnagramUtil.areAnagrams(stringList[i],stringList[j]) == true) {
            j++;
        } else {
            i = j;
        } 
    }
    return null; // for now 

public static void main(String[] args) {
    String[] ListOfSortedAnagrams = new String[] {"asp", "pas", "code", "coed", "deco" , "France" }
    System.out.print("Most occurring anagrams are: " + AnagramUtil.getLargestAnagramGroup(String[] ListOfSortedAnagrams));

Результаты: Наиболее часто встречающиеся анаграммы: код, код, деко

1 Ответ

2 голосов
/ 29 сентября 2019

Вы можете нормализовать строки, например, сортировать символы в строке и группировать их по этому нормализованному значению.

Посмотрите на:

public class Anagram {

    public static void main(String[] args) {
        String[] listAnagrams = new String[]{"asp", "pas", "code", "coed", "deco", "France"};
        Map<String, List<String>> countMap = new HashMap<>();
        for (String str : listAnagrams) {
            String normalized = normalize(str);
            List<String> strings = countMap.getOrDefault(normalized, new ArrayList<>());
            strings.add(str);
            countMap.put(normalized, strings);
        }
        Optional<Map.Entry<String, List<String>>> max = countMap.entrySet().stream()
                .max(Comparator.comparingInt(entry -> entry.getValue().size()));

        System.out.print("Most occurring anagrams are: " + max.get().getValue());
    }

    private static String normalize(String inputString){
        char[] tempArray = inputString.toCharArray();
        Arrays.sort(tempArray);
        return new String(tempArray);
    }
}

Вывод :

Most occurring anagrams are: [code, coed, deco]

PS: Это может быть реорганизовано с группой потоков, но я думаю, что этобудет менее читабельным.

Обновление : Вот версия группы потоков:

public class Anagram {

    public static void main(String[] args) {
        String[] listAnagrams = new String[]{"asp", "pas", "code", "coed", "deco", "France"};

        Optional<Map.Entry<String, List<String>>> maxNormalised = Arrays.stream(listAnagrams)
                .collect(Collectors.groupingBy(Anagram::normalize))
                .entrySet().stream()
                .max(Comparator.comparingInt(entry -> entry.getValue().size()));

        System.out.print("Most occurring anagrams are: " + maxNormalised.get().getValue());
    }

    private static String normalize(String inputString){
        char[] tempArray = inputString.toCharArray();
        Arrays.sort(tempArray);
        return new String(tempArray);
    }
}
...