Name search

The problem

Write a program that reads the contents of the two files into two separate arrays, or ArrayLists. The user should be able to enter a boy’s name, or a girl’s name, or both, and the application will display a message indicating whether the names were among the most popular.

The exercises will use two files:

  • GirlNames.txt - this file contains a list of the 200 most popular names given to girls born in the United States for the years 2000 through 2009.
  • BoysNames.txt - this file contains a list of the 200 most popular names given to boys born in the United States fro the years 2000 through 2009.

In the code below we will read a text file using java 8 retrieving the names from the two files creating an associated arraylist for girls and boys names. We will then search for the name entered in each of lists using a lambda expression and java 8's stream anyMatch method.

Breaking it down

public static void main(String args[]) throws IOException {

    Path boysNamesPath = Paths
            .get("src/main/resources/com/levelup/java/exercises/beginner/BoyNames.txt")
            .toAbsolutePath();

    Path girlsNamePath = Paths
            .get("src/main/resources/com/levelup/java/exercises/beginner/GirlNames.txt")
            .toAbsolutePath();

    // read boys names
    List<String> boysNames = Files.lines(boysNamesPath).collect(
            Collectors.toList());

    // ready girls names
    List<String> girlsNames = Files.lines(girlsNamePath).collect(
            Collectors.toList());

    // ask user get name from user
    String searchName = getNamesFromUser();

    displaySearchResults(searchName, boysNames, girlsNames);

}

/**
 * Method should ask user to input a name
 *
 * @return name to be searched
 */
public static String getNamesFromUser() {

    // Create a Scanner object to read input.
    Scanner keyboard = new Scanner(System.in);

    // Get a name from user
    System.out.println("Popular Name Search");
    System.out.print("Enter a name: ");

    String name = keyboard.nextLine();

    keyboard.close();

    return name;
}

/**
 * Method should determine and output if a name is contained with in lists
 * passed
 *
 * @param searchName
 * @param boysNames
 * @param girlsNames
 * @throws IOException
 */
public static void displaySearchResults(String searchName,
        List<String> boysNames, List<String> girlsNames) throws IOException {

    System.out.println("\nHere are the search results:\n");

    boolean popularBoyName = boysNames.stream().anyMatch(
            p -> p.equalsIgnoreCase(searchName));
    boolean popularGirlName = girlsNames.stream().anyMatch(
            p -> p.equalsIgnoreCase(searchName));

    // Display the results.
    if (popularBoyName) {
        System.out.println(searchName + " is a popular boy's name.");
    }
    if (popularGirlName) {
        System.out.println(searchName + " is a popular girl's name.");
    }
    if (!popularBoyName && !popularGirlName) {
        System.out.println(searchName + " is not a popular name.");
    }
}

Output

Popular Name Search
Enter a name: Alexander

Here are the search results:

Alexander is a popular boy's name.

Level Up

  • Modify the program to to allow users to enter in multiple names seperated by a comma as input. Refernece split a string by a comma.