So, leveraging the tooling API would be a lot of work.

> Simplest way:

Per Adrian this may be another easy way but you would have to refactor the JS to apex:

https://salesforce.stackexchange.com/questions/4462/get-lists-of-dependent-picklist-options-in-apex

Apex Version (Code below is from link, I take no credit):

http://titancronus.com/blog/2014/05/01/salesforce-acquiring-dependent-picklists-in-apex/

    public class Bitset{
            public Map<String,Integer> AlphaNumCharCodes {get;set;}
            public Map<String, Integer> Base64CharCodes { get; set; }
            public Bitset(){
                LoadCharCodes();
            }
            //Method loads the char codes
            private void LoadCharCodes(){
                AlphaNumCharCodes = new Map<String,Integer>{
                    'A'=>65,'B'=>66,'C'=>67,'D'=>68,'E'=>69,'F'=>70,'G'=>71,'H'=>72,'I'=>73,'J'=>74,
                    'K'=>75,'L'=>76,'M'=>77,'N'=>78,'O'=>79,'P'=>80,'Q'=>81,'R'=>82,'S'=>83,'T'=>84,
                    'U'=>85,'V'=> 86,'W'=>87,'X'=>88,'Y'=>89,'Z'=>90    
                };
                Base64CharCodes = new Map<String, Integer>();
                //lower case
                Set<String> pUpperCase = AlphaNumCharCodes.keySet();
                for(String pKey : pUpperCase){
                    //the difference between upper case and lower case is 32
                    AlphaNumCharCodes.put(pKey.toLowerCase(),AlphaNumCharCodes.get(pKey)+32);
                    //Base 64 alpha starts from 0 (The ascii charcodes started from 65)
                    Base64CharCodes.put(pKey,AlphaNumCharCodes.get(pKey) - 65);
                    Base64CharCodes.put(pKey.toLowerCase(),AlphaNumCharCodes.get(pKey) - (65) + 26);
                }
                //numerics
                for (Integer i=0; i<=9; i++){
                    AlphaNumCharCodes.put(string.valueOf(i),i+48);
                    //base 64 numeric starts from 52
                    Base64CharCodes.put(string.valueOf(i), i + 52);
                }
            }
            public Boolean testBit(String pValidFor,Integer n){
    			//the list of bytes
                List<Integer> pBytes = new List<Integer>();
                //multiply by 6 since base 64 uses 6 bits
                Integer bytesBeingUsed = (pValidFor.length() * 6)/8;
                //will be used to hold the full decimal value
                Integer pFullValue = 0;
                //must be more than 1 byte
                if (bytesBeingUsed <= 1)
                    return false;
                //calculate the target bit for comparison
                Integer bit = 7 - (Math.mod(n,8)); 
                //calculate the octet that has in the target bit
                Integer targetOctet = (bytesBeingUsed - 1) - (n >> bytesBeingUsed); 
                //the number of bits to shift by until we find the bit to compare for true or false
                Integer shiftBits = (targetOctet * 8) + bit;
                //get the base64bytes
                for(Integer i=0;i<pValidFor.length();i++){
                    //get current character value
                    pBytes.Add((Base64CharCodes.get((pValidFor.Substring(i, i+1)))));
                }
                //calculate the full decimal value
                for (Integer i = 0; i < pBytes.size(); i++)
                {
                    Integer pShiftAmount = (pBytes.size()-(i+1))*6;//used to shift by a factor 6 bits to get the value
                    pFullValue = pFullValue + (pBytes[i] << (pShiftAmount));
                }
                //& is to set the same set of bits for testing
    			//shift to the bit which will dictate true or false
                Integer tBitVal = ((Integer)(Math.Pow(2, shiftBits)) & pFullValue) >> shiftBits;
                return  tBitVal == 1;
            }
        }


 

    /*
         * @Summary: Entity to represent a json version of a picklist entry
         * so that the validFor property becomes exposed
        */
        public class TPicklistEntry{
            public string active {get;set;}
            public string defaultValue {get;set;}
            public string label {get;set;}
            public string value {get;set;}
            public string validFor {get;set;}
            public TPicklistEntry(){
                
            }
        }


**Code to use above utility to get the dependant values**

    public static Map<String,List<String>> GetDependentOptions(String pObjName, String pControllingFieldName, String pDependentFieldName){
            Map<String,List<String>> objResults = new Map<String,List<String>>();
            //get the string to sobject global map
            Map<String,Schema.SObjectType> objGlobalMap = Schema.getGlobalDescribe();
            if (!objGlobalMap.containsKey(pObjName))
                return objResults;
            //get the type being dealt with
            Schema.SObjectType pType = objGlobalMap.get(pObjName);
            Map<String, Schema.SObjectField> objFieldMap = pType.getDescribe().fields.getMap();
            //verify field names
            if (!objFieldMap.containsKey(pControllingFieldName) || !objFieldMap.containsKey(pDependentFieldName))
                return objResults;     
            //get the control values   
            List<Schema.PicklistEntry> ctrl_ple = objFieldMap.get(pControllingFieldName).getDescribe().getPicklistValues();
            //get the dependent values
            List<Schema.PicklistEntry> dep_ple = objFieldMap.get(pDependentFieldName).getDescribe().getPicklistValues();
            //iterate through the values and get the ones valid for the controlling field name
            TStringUtils.Bitset objBitSet = new TStringUtils.Bitset();
            //set up the results
            for(Integer pControllingIndex=0; pControllingIndex<ctrl_ple.size(); pControllingIndex++){        	
                //get the pointer to the entry
                Schema.PicklistEntry ctrl_entry = ctrl_ple[pControllingIndex];
                //get the label
                String pControllingLabel = ctrl_entry.getLabel();
                //create the entry with the label
                objResults.put(pControllingLabel,new List<String>());
            }
            //cater for null and empty
             objResults.put('',new List<String>());
             objResults.put(null,new List<String>());
            //check the dependent values
            for(Integer pDependentIndex=0; pDependentIndex<dep_ple.size(); pDependentIndex++){        	
                //get the pointer to the dependent index
               	Schema.PicklistEntry dep_entry = dep_ple[pDependentIndex];
               	//get the valid for
                String pEntryStructure = JSON.serialize(dep_entry);                
                TStringUtils.TPicklistEntry objDepPLE = (TStringUtils.TPicklistEntry)JSON.deserialize(pEntryStructure, TStringUtils.TPicklistEntry.class);
                //if valid for is empty, skip
                if (objDepPLE.validFor==null || objDepPLE.validFor==''){
                    continue;
                }
                //iterate through the controlling values
                for(Integer pControllingIndex=0; pControllingIndex<ctrl_ple.size(); pControllingIndex++){    
                	if (objBitSet.testBit(objDepPLE.validFor,pControllingIndex)){            		
    		            //get the label
    		            String pControllingLabel = ctrl_ple[pControllingIndex].getLabel();
                        objResults.get(pControllingLabel).add(objDepPLE.label);
                    }
                }
            } 
            return objResults;
        }

> Second simple way:

1. Create another object / custom setting with fields

- Master Value
- Dependent Field API Name
- Dependant Field Value

2. Populate as appropriate
3. Create a trigger (or Process builder) to use this new object to find and set the values accordingly

Pros: **Quick** to implement

Cons: **Maintenance** - Have to remember to update this table when pick list values change. - **NOT** a best practice but given for those with minimal coding skills


> Harder way:

1. Use the tooling API and the describeLayout method to determine the pick list values based off of the master value. 

Pros: **None** really given the above methods

Cons: **Slow** to implement and a lot of code required to start up. but there are examples you could possibly leverage