карта Ассоциативный массив - PullRequest
3 голосов
/ 10 апреля 2020

У меня есть для ввода int[] со следующим содержанием:

[5, 65, 22, 1, 58, 5, 69, 12, 1, 22, 22, 58, 12, 54, 89]

Используя Map<Object, AtomicInteger>, я преобразую его в следующий объект:

{1=2, 65=1, 5=2, 69=1, 22=3, 58=2, 12=1}

В другом словами, я вычисляю повторяющиеся элементы массива Dynami c.

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

Код класса повторяющихся элементов приведен ниже:

public Map<Object, AtomicInteger> countRepeatingElements(int[] inputArray) {
    ConcurrentMap<Object, AtomicInteger> output = 
                  new ConcurrentHashMap<Object, AtomicInteger>();

    for (Object i : inputArray) {
        output.putIfAbsent(i, new AtomicInteger(0));
        output.get(i).incrementAndGet();
    }

    return output;
}

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Если вы хотите найти максимальное и минимальное вхождения, выполните итерацию по карте, используя EntrySet, и сравните значения каждого ключа.

int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for(Map.Entry<Object, AtomicInteger> entry : output.entrySet()){
    if(entry.getValue().intValue() < min){
        min = entry.getValue().intValue();
    }
    if(entry.getValue().intValue() > max){
        max = entry.getValue().intValue();
    }
// entry.getValue() gives you number of times number occurs
// entry.getKey() gives you the number itself
}
1 голос
/ 10 апреля 2020
int[] inputArray = {5, 65, 22, 1, 58, 5, 69, 12, 1, 22, 22, 58, 12, 54, 89};

// 1
Map<Integer, Long> grouped = Arrays.stream(inputArray)
        .boxed()
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

// 2
LongSummaryStatistics stats = grouped.values()
        .stream()
        .mapToLong(Long::longValue)
        .summaryStatistics();

System.out.println(stats.getMax());
System.out.println(stats.getMin());
...