【问题标题】:How to return the list of the highest occurring anagrams within an array?如何返回数组中出现次数最多的字谜列表?
【发布时间】:2020-01-29 01:40:48
【问题描述】:

我有一个关于如何返回在单个数组的索引中相邻放置的排序字谜列表的问题。为了澄清这一点:

Array sortedAnagrams:
sortedAnagrams[0] = asp
sortedAnagrams[1] = 过去
sortedAnagrams[2] = 代码
sortedAnagrams[3] = 男女同校
sortedAnagrams[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));

结果: 出现最多的字谜是:code、coed、deco

【问题讨论】:

    标签: java arrays anagram


    【解决方案1】:

    您可以规范化字符串,例如对字符串中的字符进行排序并按此规范化值对它们进行分组。

    看看:

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-19
      • 2020-11-04
      • 2017-03-18
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多