我正在尝试输入一系列名称并将它们存储到一个数组中,以便在需要时准备打印。例如,
输入:
Bill Cosby[enter]
Jack Bob[enter]
输出:
Cosby, Bill
Jack, Bob
这就是我解决问题的方法,我决定首先将所有名称存储到一个数组(_StudentNames
)中,然后我计划在每个空间拆分数组并将单独的名称存储到一个新的数组(_StudentNamesSplit
),它将是两倍大。在那之后,当需要打印一个名字时,我会简单地做一些像
out.print(_StudentNamesSplit[1] + ", " + _StudentNamesSplit[0]);
我理解我的问题是,使用此代码,只输入的姓氏将存储到数组中。
我愿意接受任何解决这个问题的建议,或者甚至是完全不同的方法来执行这项任务。如果有一种方法可以将用逗号反转的名称存储到数组的一个元素中,但是可能会有点提升呢?
out.print("How many students are in the class? ");
int _numStudents = scanInt.nextInt();
String[] _StudentNames = new String[_numStudents];
String[] _StudentNamesSplit = new String[_numStudents * 2];
for (int i = 0; i < _numStudents; ++i)
{
_StudentNames[i] = scanString.nextLine();
_StudentNamesSplit = _StudentNames[i].split(" ");
}
答案 0 :(得分:1)
如果您只需要一个名称相反的数组(例如“Cosby,Bill”),那么以下短片就足够了:
public static giveReversedNames(String[] names) {
String[] reversedNames = new String[names.length];
for (int i = 0; i < names.length; i++) {
List<String> rev_pair = Collections.reverse(Arrays.asList(name.split(" ")));
reversedNames[i] = Joiner.on(",").join(rev_pair);
}
return reversedNames;
}
我正在使用Collections#reverse()
和Joiner#join()
,但当然,您可以使用任何其他方法代替。
答案 1 :(得分:1)
我建议你使用Student课程(比如这个) -
public static class Student {
private String firstName;
private String lastName;
public void setFirstName(String firstName) {
this.firstName = (firstName != null) ? firstName
.trim() : "";
}
public void setLastName(String lastName) {
this.lastName = (lastName != null) ? lastName
.trim() : "";
}
public Student(String firstName, String lastName) {
setFirstName(firstName);
setLastName(lastName);
}
public Student(String[] names) {
if (names != null && names.length == 2) {
setFirstName(names[0]);
setLastName(names[1]);
}
}
public String toString() {
return this.lastName + ", " + this.firstName;
}
}
你可以这样使用它(注意它现在没有界限,lastname, firstname
由Student.toString()
方法处理 -
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<Student> al = new ArrayList<Student>();
try {
System.out.println("Enter student names [firstname lastname], CTRL-D to stop.");
String line;
while ((line = scanner.nextLine()) != null) {
if (line != null) {
line = line.trim();
String[] names = line.split(" ");
if (names.length == 2) {
al.add(new Student(names));
}
}
}
} finally {
for (Student student : al) {
System.out.println(student);
}
scanner.close();
}
}
答案 2 :(得分:1)
你不能用“,”反转顺序组成字符串,然后输入数组 ** _ StudentNamesSplit **。另外由于你无法确定数组的大小,我认为最好使用 ArrayList 来实现这一点。例如,你可以使用这样的东西。
Scanner sn= new Scanner(System.in);
String unformatted_name;
ArrayList<String> names=new ArrayList<String>();
ArrayList<String> reverse_names=new ArrayList<String>();
StringBuilder formatted_name = new StringBuilder();
while(sn.hasNext()){
unformatted_name=sn.nextLine();
for (String retval: unformatted_name.split(" ", 2)){
names.add(retval);
}
formatted_name.append(names.get(1).toString());
formatted_name.append(',');
formatted_name.append(names.get(0).toString());
reverse_names.add(formatted_name.toString());
}
由于您不知道要输入多少行,最好使用 ArrayList 。
答案 3 :(得分:0)
_StudentNamesSplit
只需要是一个多维数组:
String[][] _StudentNamesSplit = new String[_numStudents][2];
然后在拆分时,将拆分结果放在索引i
:
_StudentNamesSplit[i] = _StudentNames[i].split(" ");
当你写下学生姓名时,你会这样做:
out.print(_StudentNamesSplit[studentIndex][1] + ", " + _StudentNamesSplit[studentIndex][0]);
你也可以将你最初想到的阵列的两倍大。它不起作用的原因是您将最后一次拆分的结果放在变量_StudentNamesSplit
中,基本上替换了以前的数据。相反,您必须将拆分结果复制到数组中。使用多维数组的方法稍微简单一些。
答案 4 :(得分:0)
您只能使用一个数组来存储数据(它是否需要是数组?为什么不使用List?)。然后,对于输入的每个名称,您将对其进行处理(仅在输入时),并使用您想要的格式存储它们。 然后,要打印它们,只需浏览阵列并打印每个元素。
顺便说一下,Array中的每个元素都可以包含空格,因此您不需要创建两倍于要插入的元素数量的数组。