1

I need to be able to ask user for file name, then display the names formatted.

Write a java program that reads a sequence of names (first name followed by last name, separated by at least one space) from a text file and:

Displays the list of names (last name followed by a comma, followed by one space, followed by first name) that are read from the input file in ascending order. Each first name and last name must be capitalized (first letter in upper case and the remaining letters in lower case). First and last names must be lined up as per the example below.

For each first name in the file, displays the number of times that the first name appears in the file. (i.e. firstName: count). This list of first names must be displayed in the ascending order of the first names. Each first name must be capitalized (first letter in upper case and the remaining letters in lower case) and displayed only once. First names and counts must be lined up as per the example below.

For each last name in the file, displays the number of times that the last name appears in the file. (i.e. lastName: count). This list of last names must be displayed in the ascending order of the last names. Each last name must be capitalized (first letter in upper case and the remaining letters in lower case) and displayed only once. Last names must be lined up as per the example below.

For each name in the file, (last name followed by a comma, followed by one space, followed by first name) displays the number of times that the names appears in the file. (i.e. name: count). This list of names must be displayed in the ascending order of the names. All first and last names must be capitalized. Each name must be displayed only once. First names, last names and counts must be lined up as per the example below.

Displays the list of unique names (last name followed by a comma, followed by one or more spaces, followed by first name) in ascending order. First names and last names must be lined up as per the example below.

Writes the list of unique names (last name followed by a comma, followed by one or more spaces, followed by first name) in ascending order to a text file. First names and last names be lined up similar to display in item 5.

The program must ask the user to provide the names of the input and output files

The output should be:

 Enter the name of the input file

 input.txt

 ******* All Names *********
 Beres, Kirsten
 Beres, Kirsten
 Beumer, Gretta
 Hutt, Colette
 Hutt, Shawanda
 Jones, Colette
 Jones, Marcia
 Koenig, Gerri
 Means, Tijuana
 Montilla, Adriana
 Montilla, Adriana
 Montilla, Adriana
 Montilla, Adriana
 Mossman, Emmanuel
 Sapienza, Colette
 Sapienza, Colette
 Shover, Neva
 Stanfill, Marcia

 ******* First Names count*********
 Adriana 4
 Colette 4
 Emmanuel 1
 Gerri 1
 Gretta 1
 Kirsten 2
 Marcia 2
 Neva 1
 Shawanda 1
 Tijuana 1
 ******* Last Names count *********
 Beres 2
 Beumer 1
 Hutt 2
 Jones 2
 Koenig 1
 Means 1
 Montilla 4
 Mossman 1
 Sapienza 2
 Shover 1
 Stanfill 1
 ******* All Names count*********
 Beres, Kirsten 2
 Beumer, Gretta 1
 Hutt, Colette 1
 Hutt, Shawanda 1
 Jones, Colette 1
 Jones, Marcia 1
 Koenig, Gerri 1
 Means, Tijuana 1
 Montilla, Adriana 4
 Mossman, Emmanuel 1
 Sapienza, Colette 2
 Shover, Neva 1
 Stanfill, Marcia 1
 ******* All Unique Names *********
 Beres, Kirsten
 Beumer, Gretta
 Hutt, Colette
 Hutt, Shawanda
 Jones, Colette
 Jones, Marcia
 Koenig, Gerri
 Means, Tijuana
 Montilla, Adriana
 Mossman, Emmanuel
 Sapienza, Colette
 Shover, Neva
 Stanfill, Marcia

 Enter the name of the output file
 output.txt

This is what I have so far but I feel lost, cannot find a way to capitalize and count. I have tried several things but nothing seems to work.

public static void getNames(ArrayList<String> fn,
                            ArrayList<String> ln) throws IOException {

    Scanner kb = new Scanner(System.in);

    System.out.print("What is the name input file? ");

    String fileName = kb.next();

    File inpFile = new File(fileName);
    Scanner in = new Scanner(inpFile);

    while (in.hasNext()) {
        String firstName = in.next();
        String lastName = in.next();
        fn.add(firstName);
        ln.add(lastName);
    }
}

public static void display(ArrayList<String> names) {
    for (int i = 0; i < names.size(); i++) {

        System.out.println(names.get(i));
    }
}

public static void capitalize(ArrayList<String> firstName) {
    for (int i = 0; i < firstName.size(); i++) {
        firstName.set(i; toCapital(firstName.get(i)));
    }
}
 /*
 * public static void capitalize(ArrayList<String> names) {
 * for (int i = 0; i < names.size(); i++){
 * names.set(i,toCapital(names.get(i)));
 * }
 * }
 */
//public static String toCapital (String name){
//String.toUpperCase(name.charAt(0)) +

//String.toLowerCase(name.substring(1));

//return j;
//}
public static void main(String[] args) throws IOException {
    // TODO code application logic here
    ArrayList<String> first = new ArrayList<>();
    ArrayList<String> last = new ArrayList<>();
    getNames(first, last);
    //display(first);
    //display(last);
    ArrayList<String> allNames = new ArrayList<>();
    for (int i = 0; i < first.size(); i++) {
        allNames.add(last.get(i) + ", " + first.get(i));
    }

    display(allNames);
}

This is the content of the input file:

colette Sapienza
gretta Beumer
EMManuel Mossman
Colette Sapienza
marcia Jones
Shawanda Hutt
Adriana monTILla
adriana montilla
Adriana Montilla
Colette Jones
Colette Hutt
Marcia Stanfill
NeVa shover
tijuana Means
Adriana Montilla
gerri KoeNig
Kirsten beres
Kirsten Beres
hhhh
  • 137
  • 2
  • 11
  • 2
    what does the file contain? – AbtPst Nov 04 '15 at 15:29
  • http://stackoverflow.com/questions/1892765/capitalize-first-char-of-each-word-in-a-string-java – ergonaut Nov 04 '15 at 15:33
  • Provide us with a sample names file, we might be able to help you then. – QuakeCore Nov 04 '15 at 15:33
  • 1
    You are supposed to add the information as an edit to the question, where you can format it properly. Data and code do not belong in the comments. – RealSkeptic Nov 04 '15 at 15:37
  • `"nothing seems to work"` - What do you mean by that? You have given some code and your expected output, but you haven't explained what you have tried and what you are currently getting. This would also be easier to use if you provided an [MCVE](https://stackoverflow.com/help/mcve), as your code will not compile. – mkobit Nov 04 '15 at 15:48
  • it means that i only get the original list of names with no change. Nothing is capitalized. – hhhh Nov 04 '15 at 15:51
  • Should we close this as a duplicate of [How to capitalize the first letter of a string in Java](http://stackoverflow.com/q/3904579/4125191) or as a duplicate of [Count the occurences of items in ArrayList](http://stackoverflow.com/q/2647232/4125191)? – RealSkeptic Nov 04 '15 at 15:55
  • wait don t close my post – hhhh Nov 04 '15 at 15:55
  • i read theother posts and could not find the help i needed, so why would you close my question?????????? – hhhh Nov 04 '15 at 15:56
  • you really have nothing to do.... instead of trying to help you just look for mistakes so you can pick on, wow, it is really sad.... off topic or not i still need help, and that why this site is for, interact, not be a perfect formatter or question editor.... but oh well, this is my last time ever on this site. – hhhh Nov 04 '15 at 16:25

1 Answers1

1

You can count the occurrences of each name using a HashMap, e.g. for first names:

HashMap<String, Integer> firstNameCountMap = new HashMap<String, Integer>();
for (String firstName : first) {
    if (firstNameCountMap.containsKey(firstName)) 
        firstNameCountMap.put(firstName, firstNameCountMap.get(firstName)++);
    else
        firstNameCountMap.put(firstName, 0);
}
System.out.println("******* First Names count*********");
for (String firstName : firstNameCountMap.keySet()) {
    System.out.println(firstName + " " + firstNameCountMap.get(firstName));
}

Then repeat for last names and all names. To capitalize the first character in a String see here, but essentially:

String capitalisedFirstName = firstName.substring(0, 1).toUpperCase() + firstName.substring(1);

EDIT

Since you need to put this functionality into predefined methods find(String s, ArrayList<String> a) and capitalize(ArrayList<String> names) you'll have to do a linear search in find, e.g.:

public static int find(String s, ArrayList<String> a) {
    int count = 0;
    for (String str : a) {
        if (str.equalsIgnoreCase(s))
            count++;
    }
    return count;
}

and to edit the collection of names to capitalized versions:

public static void capitalize(ArrayList<String> names) {
    for (int i=0; i<names.size(); i++) {
        String capitalizedName = names.get(i).substring(0, 1).toUpperCase() + names.get(i).substring(1);
        names.set(i, capitalizedName);
    }
}
Community
  • 1
  • 1
jonk
  • 1,494
  • 11
  • 13