Code review comment: removeOneGroup method is more complex and unnecessary. I don't think this change is better.

Code under review:
private void mergeGroup(Group srcGroup, Group dstGroup) {
        
        if (srcGroup == rootGroup) {
            rootGroup = dstGroup;
        }

        
        
        List<GroupExpression> needReinsertedExpressions = Lists.newArrayList();
        for (Iterator<Map.Entry<GroupExpression, GroupExpression>>
                iterator = groupExpressions.entrySet().iterator(); iterator.hasNext(); ) {
            GroupExpression groupExpr = iterator.next().getKey();

            
            int referSrcGroupIndex = -1;
            for (int i = 0; i < groupExpr.getInputs().size(); i++) {
                if (groupExpr.getInputs().get(i) == srcGroup) {
                    referSrcGroupIndex = i;
                    break;
                }
            }

            
            
            if (referSrcGroupIndex >= 0) {
                iterator.remove();
                groupExpr.getInputs().set(referSrcGroupIndex, dstGroup);
                needReinsertedExpressions.add(groupExpr);
            }

            
            if (groupExpr.getGroup() == srcGroup) {
                groupExpr.setGroup(dstGroup);
            }
        }

        for (GroupExpression groupExpression : needReinsertedExpressions) {
            if (!groupExpressions.containsKey(groupExpression)) {
                groupExpressions.put(groupExpression, groupExpression);
            } else {
                
                
                
                
                groupExpression.getGroup().removeGroupExpression(groupExpression);
                groupExpression.setUnused(true);
                GroupExpression existGroupExpression = groupExpressions.get(groupExpression);
                if (!needMerge(groupExpression.getGroup(), existGroupExpression.getGroup())) {
                    
                    
                    groupExpression.getGroup().replaceBestExpression(groupExpression, existGroupExpression);
                }
            }
        }

        dstGroup.mergeGroup(srcGroup);
        
        
        
        List<Group> groups = getAllEmptyGroups();
        for (Group group : groups) {
            removeOneGroup(group);
        }
    }


Revised code:
private void mergeGroup(Group srcGroup, Group dstGroup) {
        groups.remove(srcGroup);
        
        if (srcGroup == rootGroup) {
            rootGroup = dstGroup;
        }

        
        
        List<GroupExpression> needReinsertedExpressions = Lists.newArrayList();
        for (Iterator<Map.Entry<GroupExpression, GroupExpression>>
                iterator = groupExpressions.entrySet().iterator(); iterator.hasNext(); ) {
            GroupExpression groupExpr = iterator.next().getKey();

            
            int referSrcGroupIndex = -1;
            for (int i = 0; i < groupExpr.getInputs().size(); i++) {
                if (groupExpr.getInputs().get(i) == srcGroup) {
                    referSrcGroupIndex = i;
                    break;
                }
            }

            
            
            if (referSrcGroupIndex >= 0) {
                iterator.remove();
                groupExpr.getInputs().set(referSrcGroupIndex, dstGroup);
                needReinsertedExpressions.add(groupExpr);
            }

            
            if (groupExpr.getGroup() == srcGroup) {
                groupExpr.setGroup(dstGroup);
            }
        }

        for (GroupExpression groupExpression : needReinsertedExpressions) {
            if (!groupExpressions.containsKey(groupExpression)) {
                groupExpressions.put(groupExpression, groupExpression);
            } else {
                
                
                
                
                groupExpression.getGroup().removeGroupExpression(groupExpression);
                groupExpression.setUnused(true);
                GroupExpression existGroupExpression = groupExpressions.get(groupExpression);
                if (!needMerge(groupExpression.getGroup(), existGroupExpression.getGroup())) {
                    
                    
                    groupExpression.getGroup().replaceBestExpression(groupExpression, existGroupExpression);
                }
            }
        }

        dstGroup.mergeGroup(srcGroup);
        
        
        
        List<Group> groups = getAllEmptyGroups();
        for (Group group : groups) {
            removeOneGroup(group);
        }
    }