【问题标题】:How to find most common property of object in powershell or Java如何在 powershell 或 Java 中查找对象的最常见属性
【发布时间】:2018-11-03 03:31:42
【问题描述】:

所以我有点卡在我想做的事情上。我从 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

基本上每个对象都有一个组名,该组的员工和他们的经理。我目前将所有这些对象放在一个数组中。我只想为每个小组找到最常见的经理。所以在这个例子中,销售组最常见的经理是 Joe,HR 是 Steve,而 Marketing 是 Luke。唯一的问题是我的实际数组中有超过 1000 个不同的组名,所以我不能指定查找所有组,例如以“销售”作为组名,然后找到一个共同的经理。我基本上需要一些方法来查找所有具有相同名称的组而不指定它,然后找出最常见的经理是谁。如果有人知道这样做的可能方法,我将不胜感激。我正在努力弄清楚如何使用对象来做到这一点。关于如何在 Java 或 powershell 中执行此操作的任何可能的线索都会帮助我,因为我也对 Java 有一些了解,尽管 powershell 是首选,因为我正在尝试这样做。如果我不能,我可能会只是回到绘图板上尝试另一种方法。

【问题讨论】:

    标签: java arrays powershell object active-directory


    【解决方案1】:

    在 powershell 中这很简单:$ArrayOfGroupsUsersAndManagers | group-object Manager

    【讨论】:

      【解决方案2】:

      我无法告诉您具体如何执行此操作,因为我根本不知道活动目录 Java 库。不过,对于一般过程,您只需将此 Array 转换为将部门映射到要计数的经理映射的映射,然后对其进行迭代并获取每个组计数最高的经理。像

      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);
      }
      

      应该适用于您的情况。

      【讨论】:

        【解决方案3】:

        我的想法与 user3298823 基本相同,但对代码采取了一些不同的方法。您可以使用 Collections.max 来获取最常用的管理器,并使用 merge 方法来增加计数。例如,假设您想查看销售组:

            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);
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2017-09-22
          • 2018-09-08
          • 1970-01-01
          • 2018-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          相关资源
          最近更新 更多