为字符串数组中的字符串变量赋值
Assign a value to a String variable in a String array
我正在尝试在数组中为字符串变量赋值:
String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);
public class Passenger {
private String firstNameField;
private String lastNameField;
private String firstName;
private String lastName;
public Passenger(String details) {
String[] temp = details.split(",");
String[] fields = {firstNameField, lastNameField, firstName, lastName};
for (int ctr = 0; ctr < fields.length; ctr++) {
fields[ctr] = temp[ctr];
}
// Print instance variables - all null
System.out.println(this.firstNameField);
System.out.println(this.lastNameField);
System.out.println(this.firstName);
System.out.println(this.lastName);
// Print array - has values
System.out.println(Arrays.toString(fields));
}
// Methods
}
但是,实例变量本身保持为空,而 fields[]
在您遍历数组时具有值。
为什么会这样,如何实现?
在 "fields" 中,您拥有在 for 循环中设置的 "details" 的拆分值,而在实例变量中您什么也没有(它们未使用数据初始化)
因为没有设置所以为null,可以这样设置;
public class Passenger {
private String firstNameField = "a";
private String lastNameField = "b";
private String firstName = "c";
private String lastName "d";
或者像这样 constructor
的参数;
public Passenger(String details, String f, String l, String fn, String ln) {
firstNameField = a;
lastNameField = l;
firstName = fn;
lastName = ln;
.....
}
如评论中所述,您确实在 for 循环中覆盖了数组值,但您尝试打印出 class 个成员;
System.out.println(this.firstNameField);
System.out.println(this.lastNameField);
System.out.println(this.firstName);
System.out.println(this.lastName);
未初始化。
为什么不像下面这样设置数组;
String[] temp = details.split(",");
String[] fields = {temp[0], temp[1], temp[2], temp[3]};
为什么要费心其他变量,只需为每个需要的变量创建 getters
,例如;
public String getFirstName() {
return fields[2];
}
我不建议这样做,但您可以使用 Java 8 个方法参考:
public class Passenger {
private String firstNameField;
private String lastNameField;
private String firstName;
private String lastName;
public Passenger(String details) {
List<Consumer<String>> setters = Arrays.asList(this::setFirstNameField,
this::setLastNameField,
this::setFirstName,
this::setLastName);
String[] temp = details.split(",");
for (int i = 0; i < setters.size(); i++) {
setters.get(i).accept(temp[i]);
}
}
public String getFirstNameField() {
return this.firstNameField;
}
public void setFirstNameField(String firstNameField) {
this.firstNameField = firstNameField;
}
public String getLastNameField() {
return this.lastNameField;
}
public void setLastNameField(String lastNameField) {
this.lastNameField = lastNameField;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "Passenger [firstNameField=" + this.firstNameField +
", lastNameField=" + this.lastNameField +
", firstName=" + this.firstName +
", lastName=" + this.lastName + "]";
}
}
测试
String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);
System.out.println(passenger);
输出
Passenger [firstNameField=passFirst0, lastNameField=passLast0, firstName=Molly, lastName=Quinn]
字符串对象是不可变的 - 您不能更改它们的值 - 在进行赋值时,您正在更改变量(或给定数组索引处的变量)所引用的对象。
当你这样做时:
String[] fields = {firstNameField, lastNameField, firstName, lastName};
您将 fields
数组值的引用设置为 index
0 到 firstNameField
所引用的同一对象(在本例中为 null
),index
1 表示与 lastNameField
相同的对象,等等
那么,如果你这样做:
fields[ctr] = temp[ctr];
你没有改变对象的值fields[ctr]
之前(你的实例变量之一)指的是temp[ctr]的值,但你是将 fields[ctr]
设置为引用同一对象 temp[ctr]
现在正在引用。
如果要将变量作为数组引用,为什么不从一开始就将它们声明为数组?
至于 "how",我最终同意 Andreas 的第一条评论:
public Passenger(String details) {
String[] temp = details.split(",");
this.firstNameField = temp[0];
this.lastNameField = temp[1];
this.firstName = temp[2];
this.lastName = temp[3];
}
实现最简单的方法也不错。
我正在尝试在数组中为字符串变量赋值:
String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);
public class Passenger {
private String firstNameField;
private String lastNameField;
private String firstName;
private String lastName;
public Passenger(String details) {
String[] temp = details.split(",");
String[] fields = {firstNameField, lastNameField, firstName, lastName};
for (int ctr = 0; ctr < fields.length; ctr++) {
fields[ctr] = temp[ctr];
}
// Print instance variables - all null
System.out.println(this.firstNameField);
System.out.println(this.lastNameField);
System.out.println(this.firstName);
System.out.println(this.lastName);
// Print array - has values
System.out.println(Arrays.toString(fields));
}
// Methods
}
但是,实例变量本身保持为空,而 fields[]
在您遍历数组时具有值。
为什么会这样,如何实现?
在 "fields" 中,您拥有在 for 循环中设置的 "details" 的拆分值,而在实例变量中您什么也没有(它们未使用数据初始化)
因为没有设置所以为null,可以这样设置;
public class Passenger {
private String firstNameField = "a";
private String lastNameField = "b";
private String firstName = "c";
private String lastName "d";
或者像这样 constructor
的参数;
public Passenger(String details, String f, String l, String fn, String ln) {
firstNameField = a;
lastNameField = l;
firstName = fn;
lastName = ln;
.....
}
如评论中所述,您确实在 for 循环中覆盖了数组值,但您尝试打印出 class 个成员;
System.out.println(this.firstNameField);
System.out.println(this.lastNameField);
System.out.println(this.firstName);
System.out.println(this.lastName);
未初始化。
为什么不像下面这样设置数组;
String[] temp = details.split(",");
String[] fields = {temp[0], temp[1], temp[2], temp[3]};
为什么要费心其他变量,只需为每个需要的变量创建 getters
,例如;
public String getFirstName() {
return fields[2];
}
我不建议这样做,但您可以使用 Java 8 个方法参考:
public class Passenger {
private String firstNameField;
private String lastNameField;
private String firstName;
private String lastName;
public Passenger(String details) {
List<Consumer<String>> setters = Arrays.asList(this::setFirstNameField,
this::setLastNameField,
this::setFirstName,
this::setLastName);
String[] temp = details.split(",");
for (int i = 0; i < setters.size(); i++) {
setters.get(i).accept(temp[i]);
}
}
public String getFirstNameField() {
return this.firstNameField;
}
public void setFirstNameField(String firstNameField) {
this.firstNameField = firstNameField;
}
public String getLastNameField() {
return this.lastNameField;
}
public void setLastNameField(String lastNameField) {
this.lastNameField = lastNameField;
}
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return this.lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "Passenger [firstNameField=" + this.firstNameField +
", lastNameField=" + this.lastNameField +
", firstName=" + this.firstName +
", lastName=" + this.lastName + "]";
}
}
测试
String details = "passFirst0,passLast0,Molly,Quinn";
Passenger passenger = new Passenger(details);
System.out.println(passenger);
输出
Passenger [firstNameField=passFirst0, lastNameField=passLast0, firstName=Molly, lastName=Quinn]
字符串对象是不可变的 - 您不能更改它们的值 - 在进行赋值时,您正在更改变量(或给定数组索引处的变量)所引用的对象。
当你这样做时:
String[] fields = {firstNameField, lastNameField, firstName, lastName};
您将 fields
数组值的引用设置为 index
0 到 firstNameField
所引用的同一对象(在本例中为 null
),index
1 表示与 lastNameField
相同的对象,等等
那么,如果你这样做:
fields[ctr] = temp[ctr];
你没有改变对象的值fields[ctr]
之前(你的实例变量之一)指的是temp[ctr]的值,但你是将 fields[ctr]
设置为引用同一对象 temp[ctr]
现在正在引用。
如果要将变量作为数组引用,为什么不从一开始就将它们声明为数组?
至于 "how",我最终同意 Andreas 的第一条评论:
public Passenger(String details) {
String[] temp = details.split(",");
this.firstNameField = temp[0];
this.lastNameField = temp[1];
this.firstName = temp[2];
this.lastName = temp[3];
}
实现最简单的方法也不错。