我对java很新,所以不要在这里评判我。
我试图在while循环中“动态”创建和命名一些对象。
我正在从一个文本文件中读取,格式为:
name, number
name, number
name, number
etc.
到目前为止我的代码是:
int agencyCount = 0;
while ((line = buff.readLine()) != null) {
agencyCount ++; //how many agencies in the file
String[] ar = line.split(", "); //split the text file, ar[0] = name, ar[1] = number
String agNm = ar[0];
int agNo = Integer.parseInt(ar[1]); //parse ar[1] to String
String objectName = ("agency" + agencyCount); //set objectName, i.e. "agency1", "agency2", etc
AgencyDetails agency = new AgencyDetails(agNm,agNo);
}
一切正常,它只是告诉我,我不允许“动态”命名对象。我现在知道这是由于java是一种编译语言,因此必须在编译时解析所有变量名。
我已经广泛搜索了一个解决方案。我见过有人建议制作阵列,但我不确定如何实施该解决方案。 有没有人知道如何解决我的问题,或者知道如何实现数组来解决它?
答案 0 :(得分:2)
在循环之前,您要创建一个ArrayList。
ArrayList<AgencyDetails> agencyList = new ArrayList<AgencyDetails>();
然后,在while循环的最后一行中,您要将新的AgencyDetails添加到ArrayList。
agencyList.add(agency);
之后,您在ArrayList中拥有所有的AgencyDetails。
(您可能希望将objectName
提供给AgencyDetails而不是agNm
)
问候 -Kayz
答案 1 :(得分:1)
我不知道你的编程背景是什么,所以我假设你几乎没有。如果情况并非如此,请不要将其视为侮辱;)
你的问题的答案实际上取决于你真正想要的。您是否需要一个表示您的对象的变量名称,或者您希望数据上的永久名称将在整个对象的生命周期内绑定到它?
在第一种情况下,答案是否定的,这是不可能的。正如您所提到的,您需要在编译代码之前定义变量的名称。动态变量名在此上下文中没有意义,因为变量的名称仅在其范围内有效。一旦你超出了定义变量的范围,那么名称就不再存在了。
例如:
public void someMethod () {
SomeObject myNameIsJonas = createSomeObject ();
}
private SomeObject createSomeObject () {
SomeObject myNameIsMud = new SomeObject ();
return myNameIsMud;
}
在方法createSomeObject
内,保存创建对象的变量称为myNameIsMud
。退出方法并返回对象后,会将其分配给名为myNameIsJonas
的变量。因此,即使您在Java中使用了动态变量名称,也不会真正重要,因为一旦退出方法myNameIsMud
,变量createSomeObject
就不再存在。
但是,如果您想要的是对象上的某种永久性标记,则很容易实现。您可以在类(AgencyDetails
)中添加私有类成员,并从构造函数或setter方法(setAgencyName (String name)
)设置它。然后,您可以将此名称用作Map
。
public class AgencyDetails {
private String name = "";
public AgencyDetails (String name, int number) {
this.name = name;
}
public String getName () {
return name;
}
}
public class LesClaypool {
private Map<String, AgencyDetails> agencyMap = new HashMap<String, AgencyDetails> ();
public void doWork () {
// Read agency info from file into nameFromFile and numberFromFile
AgencyDetails agency = new AgencyDetails (nameFromFile, numberFromFile);
agencyMap.put (agency.getName (), agency);
}
public AgencyDetails getAgencyDetailsByName (String name) {
return agencyMap.get (name);
}
}
从文件中读取代理商详细信息后,您可以使用名称作为密钥将其存储到Map
中。然后,您可以通过向AgencyDetails
方法提供其名称来获取您感兴趣的getAgencyDetailsByName
实例,如上面的简单示例所示。
答案 2 :(得分:0)
我建议您使用Map,以便将每个对象与对象名称相关联。您可以使用Map<String,AgencyDetails>
之类的内容。