Closed. This question is
off-topic。它当前不接受答案。
想改善这个问题吗?
Update the question,所以它是
on-topic,用于堆栈溢出。
4年前关闭。
我需要能够向用户询问文件名,然后显示格式化的名称。
编写一个Java程序,该程序从文本文件中读取一系列名称(名字,后跟姓氏,至少用一个空格隔开),然后:
显示从输入文件中升序读取的名称列表(姓氏后跟逗号,后跟一个空格,后跟名字)。每个名字和姓氏必须大写(首字母大写,其余字母小写)。必须按照以下示例排列名字和姓氏。
对于文件中的每个名字,显示名字在文件中出现的次数。 (即firstName:count)。此名字列表必须以名字的升序显示。每个名字必须大写(首字母大写,其余字母小写)并且只能显示一次。必须按照以下示例排列名字和计数。
对于文件中的每个姓氏,显示姓氏在文件中出现的次数。 (即lastName:count)。此姓氏列表必须按姓氏的升序显示。每个姓必须大写(首字母大写,其余字母小写)并且只能显示一次。必须按照以下示例排列姓氏。
对于文件中的每个名称,(姓氏后跟逗号,后跟一个空格,后跟名)显示名称在文件中出现的次数。 (即名称: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
到目前为止,这是我所拥有的,但我感到迷lost,无法找到一种资本化和计数的方法。我已经尝试了几件事,但似乎没有任何效果。
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)
玛西娅·琼斯(Marcia Jones)
肖万达·赫特(Shawanda Hutt)
阿德里安娜·蒙蒂拉(Adriana monTILla)
阿德里亚娜·蒙蒂利亚
阿德里亚娜·蒙蒂利亚(Adriana Montilla)
科莱特·琼斯
科莱特·赫特(Colette Hutt)
玛西娅·斯坦菲(Marcia Stanfill)
内华达州
提华纳手段
阿德里亚娜·蒙蒂利亚(Adriana Montilla)
格里·科尼
克尔斯滕·贝雷斯
克尔斯滕·贝雷斯
您可以使用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)
中,因此必须在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);
}
}