如何获取数组中出现次数最多的字符串?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取数组中出现次数最多的字符串?相关的知识,希望对你有一定的参考价值。

参考技术A 像选举唱票时候画正字一样,最后比较谁多谁少一样。

假设源数组 Array1

1.新建 二维数组 Array2(1,2) 储存(字符串,数量)
2.轮询 Array1,得到 Array1(i) 对应的字符串 c
3.嵌套轮询 Array2,若找到对应 c,对应 数量 +1,若找不到,重定义(扩大)Array2,对应 数量 1。
4.最后比较出Array2数量最多的字符串。

如何返回数组中出现次数最多的字谜列表?

【中文标题】如何返回数组中出现次数最多的字谜列表?【英文标题】: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

【问题讨论】:

【参考方案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);
    

【讨论】:

以上是关于如何获取数组中出现次数最多的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Java中如何提取字符串中出现最多的字符

获取数组中出现次数最多的项

获取数组中出现次数最多的数据及出现次数

获取在一个数组中出现最多的字符及其所在的位置

js - 获取字符串出现最多的字符和次数

如何求出数组中出现次数最多的数字(C#实现)