Я читаю массив из текстового файла, затем я должен использовать заглавные буквы, считать вхождения каждого имени, чтобы затем отображать всю информацию
Мне нужно иметь возможность запросить у пользователя имя файла, а затем отобразить отформатированные имена.
Напишите 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);
}
Это содержимое входного файла:
Колетта Сапиенца Гретта Боймер Э.М.Мануэль Моссман Колетта Сапиенца Марсия Джонс Шаванда Хатт Адриана Монтила Адриана Монтилья Адриана Монтилья Колетт Джонс Колетт Хатт Марсия Станфилл NeVa Shover Тихуана Средства Адриана Монтилья Джерри Кениг Кирстен берес Кирстен Берес
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);
}
}