QUESTION #2:

The following Java code is responsible for creating an HTML “SELECT”
list of U.S. states, allowing a user to specify his or her state. This might
be used, for instance, on a credit card transaction screen.

Please rewrite this code to be “better”. Submit your replacement code, and
please also submit a few brief comments explaining why you think your code
is better than the sample.

(For brevity, this sample works for only 5 states. The real version would
need to work for all 50 states. But it is fine if your rewrite shows only
the 5 states here.)

public class StateUtils {
 
  //
  // Generates an HTML select list that can be used to select a specific
  // U.S. state.
  //
  public static String createStateSelectList()
  {
    return
      "<select name=\"state\">\n"
    + "<option value=\"Alabama\">Alabama</option>\n"
    + "<option value=\"Alaska\">Alaska</option>\n"
    + "<option value=\"Arizona\">Arizona</option>\n"
    + "<option value=\"Arkansas\">Arkansas</option>\n"
    + "<option value=\"California\">California</option>\n"
    // more states here
    + "</select>\n"
    ;
  }
 
  //
  // Parses the state from an HTML form submission, converting it to
  // the two-letter abbreviation.
  //
  public static String parseSelectedState(String s)
  {
    if (s.equals("Alabama"))     { return "AL"; }
    if (s.equals("Alaska"))      { return "AK"; }
    if (s.equals("Arizona"))     { return "AZ"; }
    if (s.equals("Arkansas"))    { return "AR"; }
    if (s.equals("California"))  { return "CA"; }
    // more states here
  }
 
  //
  // Displays the full name of the state specified by the two-letter code.
  //
  public static String displayStateFullName(String abbr) {
  {
    if (abbr.equals("AL")) { return "Alabama";    }
    if (abbr.equals("AK")) { return "Alaska";     }
    if (abbr.equals("AZ")) { return "Arizona";    }
    if (abbr.equals("AR")) { return "Arkansas";   }
    if (abbr.equals("CA")) { return "California"; }
    // more states here
  }
 
}

Solution:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
 
public class Q2_StateUtils {
     
    private final static Map<String, String> statesMap = new HashMap<String, String>();
    static {
        statesMap.put("AL", "Alabama");
        statesMap.put("AK", "Alaska");
        statesMap.put("AS", "American Samoa");
        statesMap.put("AZ", "Arizona");
        statesMap.put("AR", "Arkansas");
        statesMap.put("CA", "California");
        // ... etc.
    }
 
    //
    // Generates an HTML select list that can be used to select a specific
    // U.S. state.
    // Modified: Now the select list returns the two-letter state.
    //
    public static String createStateSelectList() {
        StringBuilder html = new StringBuilder();
        html.append("<select name=\"state\">\n");
        for (Map.Entry<String, String> stateEntry : statesMap.entrySet()) {
            String stateShortName = stateEntry.getKey();
            String stateFullName = stateEntry.getValue();
            html.append("<option value=\"" + stateShortName + "\">" + stateFullName + "</option>\n");
        }
        html.append("</select>\n");
        return html.toString();
    }
 
    //
    // Parses the state from an HTML form submission, converting it to
    // the two-letter abbreviation.
    // @deprecated use {@link #saveSelectedState()} instead.
    // This method has been deprecated for the following reason:
    // * We've taken extra steps of getting a short name.
    //
    @Deprecated
    public static String parseSelectedState(String stateFullName) {
        for (Map.Entry<String, String> stateEntry : statesMap.entrySet())
            if (stateFullName == stateEntry.getValue())
                return stateEntry.getKey();
        return "";
    }
     
    //
    // Safely returns the two-letter abbreviation of the U.S. state.
    //
    public static String safeSelectedState(String stateShortName) {
        return statesMap.containsKey(stateShortName) ? stateShortName : "";
    }
 
    //
    // Displays the full name of the state specified by the two-letter abbreviation.
    //
    public static String displayStateFullName(String stateShortName) {
        return statesMap.getOrDefault(stateShortName, "");
    }
     
    public static void main(String[] args) throws IOException {
        System.out.println("#1. createStateSelectList()");
        String expectedStateList = new String(Files.readAllBytes(Paths.get("Q2_ExpectedStateSelect.list")), "utf8");
        System.out.println(createStateSelectList() == expectedStateList);
         
        System.out.println("#2.1. safeSelectedState(\"MI\")");
        System.out.println(safeSelectedState("MI") == "MI");
         
        System.out.println("#2.2. safeSelectedState(\"XX\")");
        System.out.println(safeSelectedState("XX") == "");
         
        System.out.println("#2.3. safeSelectedState(\"\")");
        System.out.println(safeSelectedState("") == "");
         
        System.out.println("#3.1. displayStateFullName(\"ND\")");
        System.out.println(displayStateFullName("ND") == "North Dakota");
         
        System.out.println("#4.2. displayStateFullName(\"XX\")");
        System.out.println(displayStateFullName("XX") == "");
         
        System.out.println("#4.3. displayStateFullName(\"\")");
        System.out.println(displayStateFullName("") == "");
    }
}

Output:

#1. createStateSelectList()
true
#2.1. safeSelectedState("MI")
true
#2.2. safeSelectedState("XX")
true
#2.3. safeSelectedState("")
true
#3.1. displayStateFullName("ND")
true
#4.2. displayStateFullName("XX")
true
#4.3. displayStateFullName("")
true