Вот прагматическая альтернатива решениям @RodrigoRodrigues уже предоставлена. В отсутствие каких-либо хороших доказательств (вопрос серьезно не указан), что мы должны быть обеспокоены асимптотической сложностью и всеми этими хорошими вещами, вот простая простая функция, которая потребовала около 5 минут для разработки, кодирования и тестирования.
Эта функция принимает массив целых чисел ранга-1 и возвращает обратно массив ранга-1 целых чисел, каждый элемент соответствует счету этого элемента во входном массиве. Если это описание смущает вас, несите меня и читайте код, который довольно прост:
FUNCTION get_counts(arr) RESULT(rslt)
INTEGER, DIMENSION(:), INTENT(in) :: arr
INTEGER, DIMENSION(SIZE(arr)) :: rslt
INTEGER :: ix
DO ix = 1, SIZE(arr)
rslt(ix) = COUNT(arr(ix)==arr)
END DO
END FUNCTION get_counts
Для входного массива [1,1,2,3,4,1,5]
он возвращает [3,3,1,1,1,3,1]
. Если OP хочет использовать это в качестве основы для функции, чтобы увидеть, есть ли какое-либо значение, которое происходит n
раз, тогда OP мог написать
any(get_counts(rank_1_integer_array)==n)
Если OP обеспокоен тем, какие элементы присутствуют n
, тогда довольно просто использовать результат get_counts
для возврата к исходному массиву для извлечения этого элемента.
Это решение является прагматическим в том смысле, что оно скупое с временем my , а не со временем компьютера. Мое решение несколько расточительно для пространства, что может быть проблемой для очень больших входных массивов. Любой из решений Родриго может превзойти мои, как во времени, так и в пространстве, в пределе.