我正在从文本文件中读取一个数组,然后我应该大写,计算每个名称的出现次数,然后显示所有信息

I m reading an array from a text file, then i should capitalize, count ocurrences of each name to then display all the info

我需要能够向用户询问文件名,然后显示格式化的名称。

编写一个 java 程序,从文本文件中读取一系列姓名(名字后跟姓氏,至少由一个 space 分隔)并且:

显示按升序从输入文件中读取的名称列表(姓氏后跟一个逗号,然后是一个 space,然后是名字)。每个名字和姓氏都必须大写(第一个字母大写,其余字母小写)。名字和姓氏必须按照下面的示例排列。

对于文件中的每个名字,显示名字在文件中出现的次数。 (即名字:计数)。此名字列表必须按名字的升序显示。每个名字必须大写(第一个字母大写,其余字母小写)并且只显示一次。名字和计数必须按照下面的示例排列。

对于文件中的每个姓氏,显示该姓氏在文件中出现的次数。 (即姓氏:计数)。此姓氏列表必须按姓氏的升序显示。每个姓氏必须大写(第一个字母大写,其余字母小写)并且只显示一次。姓氏必须按照以下示例排列。

对于文件中的每个名字,(姓氏后跟一个逗号,然后是一个 space,然后是名字)显示这些名字在文件中出现的次数。 (即名称:计数)。此名称列表必须按名称的升序显示。所有名字和姓氏都必须大写。每个名称只能显示一次。名字、姓氏和计数必须按照下面的示例排列。

按升序显示唯一名称列表(姓氏后跟一个逗号,后跟一个或多个 space,再后跟名字)。名字和姓氏必须按照以下示例排列。

按升序将唯一名称列表(姓氏后跟逗号,后跟一个或多个 space,后跟名字)写入文本文件。名字和姓氏的排列类似于第 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

您可以使用 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));
}

然后重复姓氏和所有姓名。要将字符串中的第一个字符大写,请参阅 here,但本质上是:

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

编辑

由于您需要将此功能放入预定义方法 find(String s, ArrayList<String> a)capitalize(ArrayList<String> names) 中,因此您必须在查找中进行线性搜索,例如:

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