Как узнать наиболее часто встречающиеся числа из строки? - PullRequest
2 голосов
/ 19 января 2012

У меня есть String, который содержит числа в форме через запятую.и я хочу извлечь большинство появившихся чисел из строки.Например, у меня есть строка типа ..

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

из приведенной выше строки, мне нужно 4, потому что 4 - это два раза в строке

, то же самое, что и

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

из приведенного выше str2 мне нужно 3,4

В случае, если все числа уникальны, тогда мне нужен первый.

предложите мне лучший подход.

Ответы [ 6 ]

2 голосов
/ 19 января 2012

Предполагая, что это домашнее задание, я предложу общую идею без кода:

  • Начните с разделения строки на символы ','
  • Создать изначально пустую карту от Integer до Integer с количеством
  • Просмотрите детали, которые вы вернули после разделения, и проанализируйте их как int значения
  • Для каждого значения посмотрите, есть ли соответствующий элемент на карте; если там есть число, увеличьте его; в противном случае добавьте запись с новым номером и 1.
  • Как только вы закончите с токенами, пройдите по карте и найдите максимальное значение
  • Если максимум равен 1, вернуть первый токен
  • Если максимум не равен 1, снова пройдите по карте и соберите все ключи там, где значение равно максимуму

Этот подход позволяет работать с очень большими числами, и он не различает числа с ведущими нулями и без них. Другими словами, он идентифицирует 3 в последовательности 1,2,03,3,3,2 как уникальный победитель, а не как ничью с 2.

2 голосов
/ 19 января 2012

Вы можете токенизировать строку, используя java.util.StringTokenizer, используя , в качестве разделителя, затем убрать начальные и конечные пробелы из каждого токена, используя String.trim(), а затем сохранить их в массив int s, используя * 1005. * функция. Тогда вы можете легко сосчитать их.

Для подсчета:

Если у вас небольшой диапазон чисел, вы можете просто создать массив счетчиков и использовать каждое число в качестве индекса для этого массива. Если нет, то вы можете использовать HashMap или что-то в этом роде.

2 голосов
/ 19 января 2012

У меня был бы массив карт целых чисел для подсчета каждого числа и переменная для хранения числа с наибольшим числом.

Разделить строку на список чисел и выполнить цикл по списку.

Каждый раз, когда вы смотрите на новое число, увеличивайте его счетчик на карте, и, если это число больше текущего наибольшего значения, меняйте текущее наибольшее значение на текущее.В конце строки верните текущее наибольшее значение.

Обратите внимание, что, если вы также сохраняете число со вторым по величине счетчиком, вы можете немного оптимизировать его, рано выходя из цикла, когда не осталось достаточно чиселчтобы позволить второму наибольшему количеству превысить самое высокое.

1 голос
/ 19 января 2012

Превратите свою строку в список чисел.

Запомните, какое первое число в списке.

Сортировка списка номеров.

Перебирайте список и сохраняйте

  • количество вхождений текущего номера.
  • текущее максимальное количество вхождений числа
  • количество различных встреченных вами чисел
  • набор чисел с числом вхождений, равным максимальному

На каждой итерации, если текущее число равно текущему максимуму, добавьте текущее число к результату. Если он больше текущего максимума, очистите набор результатов и добавьте текущий результат к результатам.

В конце цикла, если размер набора результатов равен числу различных чисел, верните первое запомненное число перед сортировкой списка.

0 голосов
/ 20 января 2012

Вот решение, использующее java.util и Guava collect .

Outline:

  1. Разделить строку на список слов
  2. Посчитайте частоту каждого слова и создайте карту Word -> Count
  3. Инвертировать для создания мультикарты Count -> Words
  4. Преобразовать в отсортированную NavigableMap
  5. Получить слова с наибольшим количеством
  6. Вернуть слова с наибольшим количеством

Код:

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();
    }
}
0 голосов
/ 19 января 2012

Попробуйте ниже код

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,

Дайте мне знать, если есть какие-либо вопросы ...

Ура !!!

...