Я читаю массив из текстового файла, затем я должен использовать заглавные буквы, подсчитывать вхождения каждого имени, чтобы затем отобразить всю информацию

Мне нужно иметь возможность запрашивать у пользователя имя файла, а затем отображать имена в формате.

Напишите программу на Java, которая считывает последовательность имен (имя, за которым следует фамилия, разделенные хотя бы одним пробелом) из текстового файла и:

Отображает список имен (фамилия, за которой следует запятая, за которым следует один пробел, за которым следует имя), считываемых из входного файла в возрастающем порядке. Каждое имя и фамилия должны быть заглавными (первая буква в верхнем регистре, а остальные буквы в нижнем регистре). Имя и фамилия должны быть выровнены, как показано в примере ниже.

Для каждого имени в файле отображается количество раз, когда оно появляется в файле. (т.е. firstName: count). Этот список имен должен отображаться в порядке возрастания имен. Каждое имя должно быть написано заглавными буквами (первая буква в верхнем регистре, а остальные буквы в нижнем регистре) и отображаться только один раз. Имена и счета должны быть выровнены, как показано в примере ниже.

Для каждой фамилии в файле отображается, сколько раз фамилия встречается в файле. (т.е. lastName: count). Этот список фамилий должен отображаться в порядке возрастания фамилий. Каждая фамилия должна быть написана с заглавной буквы (первая буква в верхнем регистре, а остальные буквы в нижнем регистре) и отображаться только один раз. Фамилии должны быть выровнены, как показано в примере ниже.

Для каждого имени в файле (фамилия, за которой следует запятая, за которым следует один пробел, за которым следует имя) отображает количество раз, когда имена появляются в файле. (т.е. имя: количество). Этот список имен должен отображаться в порядке возрастания имен. Все имена и фамилии должны быть заглавными. Каждое имя должно отображаться только один раз. Имена, фамилии и счетчики должны быть выровнены, как показано в примере ниже.

Отображает список уникальных имен (фамилия, за которой следует запятая, за которой следует один или несколько пробелов, за которыми следует имя) в возрастающем порядке. Имена и фамилии должны быть выровнены, как показано в примере ниже.

Записывает список уникальных имен (фамилия, за которой следует запятая, за которой следует один или несколько пробелов, за которыми следует имя) в порядке возрастания в текстовый файл. Имена и фамилии должны быть выровнены так же, как в пункте 5.

Программа должна попросить пользователя указать имена входных и выходных файлов.

Результат должен быть:

 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

Это то, что у меня есть до сих пор, но я чувствую себя потерянным, не могу найти способ извлечь выгоду и считать. Я пробовал несколько вещей, но, похоже, ничего не работает.

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);
}

Это содержимое входного файла:

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

person hhhh    schedule 04.11.2015    source источник
comment
что содержит файл?   -  person AbtPst    schedule 04.11.2015
comment
stackoverflow.com/questions/1892765/   -  person ergonaut    schedule 04.11.2015
comment
Предоставьте нам образец файла имен, и тогда мы сможем вам помочь.   -  person QuakeCore    schedule 04.11.2015
comment
Вы должны добавить информацию в качестве редактирования к вопросу, где вы можете ее правильно отформатировать. Данные и код не попадают в комментарии.   -  person RealSkeptic    schedule 04.11.2015
comment
"nothing seems to work" - Что вы имеете в виду? Вы предоставили некоторый код и ожидаемый результат, но не объяснили, что вы пробовали и что получаете в настоящее время. Это также было бы проще использовать, если бы вы предоставили MCVE, поскольку ваш код не будет компилироваться.   -  person mkobit    schedule 04.11.2015
comment
это означает, что я получаю только исходный список имен без изменений. Ничего не пишется с заглавной буквы.   -  person hhhh    schedule 04.11.2015
comment
Должны ли мы закрыть это как дубликат Как использовать первую букву строки в Java или как дубликат Подсчитать количество вхождений элементов в ArrayList?   -  person RealSkeptic    schedule 04.11.2015
comment
подожди, не закрывай мой пост   -  person hhhh    schedule 04.11.2015
comment
Я прочитал другие сообщения и не смог найти нужную мне помощь, так почему бы вам закрыть мой вопрос ??????????   -  person hhhh    schedule 04.11.2015
comment
вам действительно нечего делать .... вместо того, чтобы пытаться помочь вам, просто ищите ошибки, чтобы вы могли придраться, вау, это действительно печально .... не по теме или нет, мне все еще нужна помощь, и поэтому этот сайт предназначен для взаимодействия, а не для идеального форматирования или редактора вопросов .... ну да ладно, это мой последний раз на этом сайте.   -  person hhhh    schedule 04.11.2015


Ответы (1)


Вы можете подсчитать количество вхождений каждого имени, используя HashMap, например для имен:

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));
}

Затем повторите для фамилий и всех имен. Чтобы использовать первый символ в строке с заглавной буквы, см. здесь, но по сути:

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

ИЗМЕНИТЬ

Поскольку вам нужно включить эту функциональность в предопределенные методы find(String s, ArrayList<String> a) и capitalize(ArrayList<String> names), вам нужно будет выполнить линейный поиск в find, например:

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

и отредактировать коллекцию имен в версии с заглавной буквы:

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);
    }
}
person jonk    schedule 04.11.2015
comment
спасибо, я должен использовать: public static void capitalize (имена ArrayList ‹String›) - person hhhh; 04.11.2015
comment
также, public static int find (String s, ArrayList ‹String› a) - person hhhh; 04.11.2015
comment
и мы не можем использовать метод сортировки ArrayList. - person hhhh; 04.11.2015
comment
find(String s, ArrayList<String> a) должен возвращать количество записей для имени s в списке a? - person jonk; 04.11.2015
comment
обновил мой ответ, вы, вероятно, должны были упомянуть предопределенные методы в исходном вопросе - person jonk; 04.11.2015
comment
спасибо, Джонк, ты был великолепен .... я действительно ценю это - person hhhh; 04.11.2015