在Java中的while循环中为对象赋予不同的名称

时间:2014-02-04 18:01:34

标签: java class object

我对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是一种编译语言,因此必须在编译时解析所有变量名。

我已经广泛搜索了一个解决方案。我见过有人建议制作阵列,但我不确定如何实施该解决方案。 有没有人知道如何解决我的问题,或者知道如何实现数组来解决它?

3 个答案:

答案 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>之类的内容。