如何从字符串中找出最多出现的数字?

时间:2012-01-19 14:19:15

标签: java string frequency

我有一个String,其中包含逗号分隔形式的数字。我想从String中提取出现最多的数字。 例如,我有一个像..的字符串

String str="1,2,3,4,5,6,7,19,18,4";

从上面的str我需要4因为4是两次str。

相同
String str2="1,2,3,4,6,4,3,9";

从上面的str2我需要3,4

如果所有数字都是唯一的,那么我首先需要一个。

建议我采取更好的方法。

6 个答案:

答案 0 :(得分:2)

我会有一个整数映射数组来计算每个数字,而变量来存储数字最多的数字。

将字符串拆分为数字列表,然后遍历列表。

每次查看新数字时,在地图中递增其计数器,如果该计数大于当前最高计数,则将当前最高值更改为当前值。在字符串的末尾,返回当前最高值。

请注意,如果您还存储了第二大数量的数字,则可以通过提前退出循环来稍微优化,此时没有足够的数字允许第二个最高数量超过最高数量。

答案 1 :(得分:2)

您可以使用java.util.StringTokenizer使用,作为分隔符来标记字符串,然后使用String.trim()从每个标记中删除前导和尾随空格,然后将它们存储到{ {1}}使用int函数。然后你可以很容易地计算它们。

计算:

如果您的数字范围很小,那么您只需创建一个计数器数组并使用每个数字作为该数组的索引。如果没有,那么您可以使用Integer.parseInt()或类似的东西。

答案 2 :(得分:2)

假设这是一个家庭作业,我会建议一个没有代码的总体思路:

  • 首先将字符串拆分为','个字符
  • 使用计数
  • 创建IntegerInteger的初始空地图
  • 浏览您从拆分中返回的部分,并将其解析为int
  • 对于每个值,查看地图中是否有相应的项目;如果那里有一个数字,增加它;否则,添加一个包含新号码和1
  • 的条目
  • 完成令牌后,请浏览地图并找到最大值
  • 如果最大值为1,则返回第一个标记
  • 如果最大值不是1,请再次浏览地图,并收集值等于最大值的所有键

这种方法允许您使用非常大的数字,并且它不区分带有和不带前导零的数字。换句话说,它会将3序列中的1,2,03,3,3,2标识为唯一的赢家,而不是与2的关系。

答案 3 :(得分:1)

将您的String转换为数字列表。

记住列表的第一个数字。

对数字列表进行排序。

迭代列表并保持

  • 当前号码的出现次数。
  • 当前最大出现次数
  • 您遇到的不同数字的数量
  • 出现次数的数字集合等于最大值

在每次迭代时,如果当前数字等于当前最大值,则将当前数字添加到结果中。如果它大于当前最大值,则清除结果集并将当前数字添加到结果中。

在循环结束时,如果结果集的大小等于不同数字的数量,则在排序列表之前返回您记住的第一个数字。

答案 4 :(得分:0)

尝试以下代码

public class StringCheck {
    public static void main(String args[]) {
        String input = "1,2,3,4,5,6,2,3,4,1,4,33,33,33";
        String result = "";
        String[] arr1 = input.split(",");

        System.out.println("Input is : " + input);

        for (int i = 0; i < arr1.length; i++) {
            int k = 0;
            for (int j = 0; j < arr1.length; j++) {
                if (arr1[i].equals(arr1[j])) {
                    k++;
                    if (k == 2) {
                        if (result.contains(arr1[i])) {
                            break;
                        }
                        result = result + arr1[i] + ",";
                        break;
                    }
                }
            }
        }

        System.out.println("Result is " + result);
    }
}    

下面将输出

Input is : 1,2,3,4,5,6,2,3,4,1,4,33,33,33
Result is 1,2,3,4,33,

如果有任何疑问,请告诉我......

干杯!!!

答案 5 :(得分:0)

以下是使用java.utilGuava collect的解决方案。

概要

  1. 将字符串拆分为单词列表
  2. 计算每个单词的频率并创建地图Word -> Count
  3. 反转以创建多图Count -> Words
  4. 转换为已排序的NavigableMap
  5. 获取最高分的字数
  6. 返回最高计数的单词
  7. 代码:

    public class HighestCountFinder {
    
    
        public static ImmutableSet<String> findWordsWithGreatestCount(String wordsString) {
            List<String> words = split(wordsString, ",");
    
            Map<String, Integer> wordsToCounts = toMapWithCounts(words);
    
            Multimap<Integer, String> countsToWords = toInverseMultimap(wordsToCounts);
    
            NavigableMap<Integer, Collection<String>> countsToWordsSorted = toNavigableMap(countsToWords);
    
            Collection<String> wordsWithHighestCount = lastValue(countsToWordsSorted);
    
            return ImmutableSet.copyOf(wordsWithHighestCount);
        }
    
    
        public static ImmutableList<String> split(String wordsString, String separator) {
            Iterable<String> parts = Splitter.on(separator).split(wordsString);
            return ImmutableList.copyOf(parts);
        }
    
    
        public static ImmutableMap<String, Integer> toMapWithCounts(Iterable<String> entries) {
            Multiset<String> entriesWithCounts = HashMultiset.create(entries);
            return toMap(entriesWithCounts);
        }
    
    
        public static <E> ImmutableMap<E, Integer> toMap(Multiset<E> multiset) {
            ImmutableMap.Builder<E, Integer> immutableMapBuilder = ImmutableMap.builder();
            for (Multiset.Entry<E> entry : multiset.entrySet()) {
                immutableMapBuilder.put(entry.getElement(), entry.getCount());
            }
            return immutableMapBuilder.build();
        }
    
    
        public static <K, V> ImmutableMultimap<V, K> toInverseMultimap(Map<K, V> map) {
            Multimap<K, V> multimap = Multimaps.forMap(map);
            return ImmutableMultimap.copyOf(multimap).inverse();
        }
    
    
        public static <K, V> NavigableMap<K, Collection<V>> toNavigableMap(Multimap<K, V> multimap) {
            return new TreeMap<>(multimap.asMap());
        }
    
    
        public static <V> V lastValue(NavigableMap<?, V> navigableMap) {
            return navigableMap.lastEntry().getValue();
        }
    }