Как найти наиболее распространенное свойство объекта в powershell или Java - PullRequest
0 голосов
/ 24 мая 2018

Так что я немного застрял в том, что я пытаюсь сделать.Я извлек определенные группы безопасности из Active Directory и создал объекты для каждого человека в группах вместе с тем, кто является их соответствующим менеджером.Что я хотел бы сделать, так это выяснить, кто самый распространенный менеджер в группе.Вот пример чего-то, что у меня было бы

Group           Employee             Manager
Sales           Phil                 Joe
Sales           Chris                Dave
Sales           John                 Dave
Sales           Rebecca              Joe
Sales           Chris                Joe
Sales           Bob                  Annie
HR              Alex                 Steve
HR              Jill                 Steve
HR              Tom                  Maria
HR              Luke                 Steve
Marketing       Don                  Luke
Marketing       Julie                Luke
Marketing       Tim                  Mark
Marketing       Thomas               Luke

По сути, у каждого объекта есть имя группы, сотрудник группы и их менеджер.В настоящее время у меня есть все эти объекты в одном массиве.Я просто хочу, чтобы в каждой группе был найден самый распространенный менеджер.Таким образом, в этом примере самым распространенным менеджером группы продаж будет Джо, HR - Стив, а Маркетинг - Люк.Единственная проблема заключается в том, что в моем фактическом массиве содержится более 1000 различных имен групп, поэтому я не могу указать, чтобы найти все группы, например, «Sales» в качестве имени группы, а затем найти общего менеджера.Мне в основном нужен какой-то способ, чтобы просто найти все группы с одинаковыми именами без указания его, а затем из тех, кто нашел, кто является наиболее распространенным менеджером.Если кто-нибудь знает возможный способ сделать это, я был бы очень признателен.Я изо всех сил пытаюсь понять, как сделать это с объектом.Любые возможные подсказки о том, как сделать это в Java или в PowerShell, помогут мне, так как у меня также есть некоторые знания Java, хотя PowerShell предпочтительнее, потому что именно там я пытаюсь сделать это. Если я не могу, я, вероятно, будупросто вернитесь к чертежной доске, чтобы попробовать другой способ.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

У меня была в основном та же идея, что и у user3298823, но я использовал немного другой подход к коду.Вы можете использовать Collections.max для получения наиболее распространенного менеджера и метод слияния для увеличения количества.Скажем, например, вы хотели посмотреть на группу продаж:

    Map<String,Map<String,Integer>> map = new HashMap<>();

    for ( Record record : records )  {
        if ( !map.containsKey(record.group) ) {
            Map<String,Integer> counts = new HashMap<>();
            counts.put(record.manager, 1);
            map.put(record.group, counts);
        } else {
            map.get(record.group).merge(record.manager, 1, Integer::sum);
        }
    }
    List<String> mostCommon = new ArrayList<>();

    int max = Collections.max(map.get("Sales").values());

    for ( String manager : map.get("Sales").keySet() ) {
        if ( map.get("Sales").get(manager) == max ) {
            mostCommon.add(manager);
        }
    }
0 голосов
/ 24 мая 2018

в powershell это просто: $ ArrayOfGroupsUsersAndManagers |менеджер групповых объектов <- это объединит все группы в группы по точному имени менеджера, после чего вы можете расширять или делать любую погоду с этими группами.</p>

0 голосов
/ 24 мая 2018

Я не могу сказать вам, как конкретно это сделать, поскольку я вообще не знаю java-библиотеки активного каталога.Для общего процесса, однако, вы просто превратите этот массив в карту, которая отображает отдел на карту менеджеров для подсчета, а затем просто выполните итерацию по нему и получите менеджера с наибольшим количеством для каждой группы.Что-то вроде

Map<String, HashMap<String, Integer>> map = new HashMap<>();
for(activedirectoryobject ado : adoList) {
    HashMap<String, Integer> groupMap = map.get(adoList.group)
    if(groupMap != null) {
        if(groupMap.contains(adoList.manager) {
            groupMap.put(adoList.manager, groupMap.get(adoList.manager))
        } else {
            groupMap.put(adoList.manager, 1)
        }
    } else {
        Map<String, Integer> newGroup = new HashMap<>();
        newGroup.put(adoList.manager, 1); 
        map.put(adoList.group, newGroup)
    }
}
List<String> managers = new ArrayList<>();
for (Map.Entry<String, HashMap<String, Integer>> entry : map.entrySet()) {
    //entry.getKey() gets the group, entry.getValue()) gets the submap
    int highest = 0;
    String manager = '';
    for (Map.Entry<String, Integer> subEntry : map.entrySet()) {
        if(subEntry.getValue() > highest) {
            highest = subEntry.getValue();
            manager = subEntry.getKey();
        }
    }
    managers.add(manager);
}

Должно работать в вашем случае.

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