Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ArrayList中存储对对象的引用_Java_Arrays_Jsp_Arraylist - Fatal编程技术网

Java 在ArrayList中存储对对象的引用

Java 在ArrayList中存储对对象的引用,java,arrays,jsp,arraylist,Java,Arrays,Jsp,Arraylist,大家好,我正在尝试存储对arraylist“pl”的当前引用例如pl.add(本) 出于某种原因,我只得到最后一个项目的参考,而没有以前的项目。循环确实通过了所有三个项目tho 下面是我得到的代码和输出。谁能告诉我我做错了什么吗?谢谢你的帮助 // variables private String productType; private String hyperLinkParam; private ArrayList <ProductList> pl = new Ar

大家好,我正在尝试存储对arraylist“pl”的当前引用例如pl.add(本) 出于某种原因,我只得到最后一个项目的参考,而没有以前的项目。循环确实通过了所有三个项目tho

下面是我得到的代码和输出。谁能告诉我我做错了什么吗?谢谢你的帮助

       // variables
private String productType;
private String hyperLinkParam;
private ArrayList <ProductList> pl = new ArrayList<ProductList> ();

public ProductList() {

    try {

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();

       InputStream url = null;
        url = getClass().getResourceAsStream("inventory.xml");


        Document doc = db.parse(url);
        doc.getDocumentElement().normalize();

        // loop through each item
        NodeList items = doc.getElementsByTagName("item"); //Returns a list of elements with the given tag name item
        for (int i = 0; i < items.getLength(); i++)
        {

                Element e = (Element) items.item(i);
                setHyperLinkParam(e.getAttribute("name").toString());
                setProductType(getTextValue(e,"productType"));
                System.out.print(e.getAttribute("name").toString());
                System.out.println(getTextValue(e,"productType"));

                pl.add(this);


         }

          for(int j=0; j < pl.size(); j++){
            System.out.print("getHyperLinkParam: " + pl.get(j).getHyperLinkParam());
            System.out.println("getProductType: " + pl.get(j).getProductType());
          }
index.jsp

    <%
try {
org.soen487.supplychain.manufacturer.Manufacture_Service service = new org.soen487.supplychain.manufacturer.Manufacture_Service();
org.soen487.supplychain.manufacturer.Manufacture port = service.getManufacturePort();
// TODO process result here
org.soen487.supplychain.manufacturer.ProductList result = port.getProductList();
out.println("Result = "+result);

} catch (Exception ex) {
// TODO handle custom exceptions here
}
%>

这就是问题所在:

pl.add(this);
您一次又一次地添加相同的引用(
this
)。
this
的值只是对“当前”对象的引用,您正在修改循环中该对象的内容

在循环的每次迭代中,您应该创建一个新的、单独的对象,设置该对象的属性,然后将对该对象的引用添加到列表中


老实说,将
this
添加到列表中有点奇怪-通常这样的方法会出现在某个类中,该类知道如何解析XML,而不是数据项本身的实例。不清楚在哪里声明<代码> PL/<代码>,但是你应该真正考虑你的程序的结构。

你将相同的对象(这个)添加到列表中。虽然您更改了成员,但列表中的所有引用都会继续引用同一对象

您应该创建一个新对象并添加它

查看我的其他帖子

试试看

ProductList obj=new ProductList();
// some work on this object and then store it in List
pl.add(obj);

它应该会起作用,因为它会给你一个新的对象

我试着从这里发布的内容猜测ProductList和Product的总体结构。问题在于列表元素的列表和字段似乎位于单个类(即ProductList)的上下文中。这不行-需要两门课

// stores the data coming from a single Element ("item") of the document
class Product {
    private String productType;
    private String hyperLinkParam;
    public setHyperLinkParam( String hlp ){
        hyperLinkParam = hlp;
    }
    public setProductType( String pt ){
        productType = pt;
    }
}

// Container for a list of products from an inventory
class ProductList {
    private ArrayList <Product> pl = new ArrayList<Product> ();
    public ProductList() {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputStream url = getClass().getResourceAsStream("inventory.xml");
        Document doc = db.parse(url);
        doc.getDocumentElement().normalize();

        // loop through each item
        NodeList items = doc.getElementsByTagName("item"); 
        for (int i = 0; i < items.getLength(); i++){
            Element e = (Element) items.item(i);
            // create the single product from the current item
            Product prod = new Product();
            prod.setHyperLinkParam( e.getAttribute("name").toString() );
            prod.setProductType( getTextValue( e, "productType") );
            // add it to the list
            pl.add( prod );
        }
    }

    void showList(){
        for( Product prod: pl ){
        System.out.print("getHyperLinkParam: " + prod.getHyperLinkParam());
            System.out.println("getProductType: " + prod.getProductType());
        }
    }
}
//存储来自文档单个元素(“项”)的数据
类产品{
私有字符串productType;
私有字符串hyperLinkParam;
公共setHyperLinkParam(字符串hlp){
hyperLinkParam=hlp;
}
公共setProductType(字符串pt){
productType=pt;
}
}
//用于库存产品列表的容器
类产品列表{
private ArrayList pl=new ArrayList();
公共产品列表(){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
InputStream url=getClass().getResourceAsStream(“inventory.xml”);
文档doc=db.parse(url);
doc.getDocumentElement().normalize();
//循环浏览每个项目
节点列表项=doc.getElementsByTagName(“项”);
对于(int i=0;i

注意:如果ProductList和Product的构造在工厂类中,并且使用工厂方法makeProductList和makeProduct,那么一切都会变得更干净、更清晰。ProductList应该有一个addProduct方法,将add委托给它的pl成员。如何从XML中获取产品列表的知识应该在那里,而不是在构造函数中,同样,从“item”元素获取产品字段值的方式不属于产品或产品列表的代码。

我理解,但问题是如何在上面的代码中创建新对象??我修改了代码以显示我在哪里声明了变量。我是否每次都要创建一个新的pl对象?谢谢你的支持help@KSM:调用构造函数
pl
不是一个对象,它是一个变量,它的值是对列表的引用,而不是试图存储在列表中的对象。我希望看到(在循环内部)类似
Foo-Foo=new-Foo();foo.setFirstValue(…);foo.setSecondValue(…);pl.add(foo)我添加了上面提到的新编码,但它似乎不起作用,我在org.soen487.supplychain.manufacturer.ProductList(ProductList.java:47)得到了这个输出,第47行是我创建新obj objectorg.soen487.supplychain.manufacturer.ProductList(ProductList.java:47)的地方第47行是我创建新obj objectuse obj.setHyperLinkParam(e.getAttribute(“name”).toString())的地方;对象setProductType(getTextValue(e,“productType”);如果你看上面的新代码,我就是这么做的,但它似乎无法检查obj参考上的变量中存储了哪些值,我认为,这次值出错了。上面的代码确实显示了不同的项,但是,在Productlist类中,我无法访问JSP中的代码,我假设我一定没有返回正确的对象,我在code Manufacture.java和index.JSP中为上面的两个新小节命名。如果我不能以productlist.product.getMethod()的形式访问它?@KSM我不熟悉JSP,但是如果您需要获取productlist的内容(如果这是“out.println”(“result=“+result”)应该实现的),那么您必须添加一个toString()方法到ProductList:使用StringBuilder并附加pl的所有元素。
// stores the data coming from a single Element ("item") of the document
class Product {
    private String productType;
    private String hyperLinkParam;
    public setHyperLinkParam( String hlp ){
        hyperLinkParam = hlp;
    }
    public setProductType( String pt ){
        productType = pt;
    }
}

// Container for a list of products from an inventory
class ProductList {
    private ArrayList <Product> pl = new ArrayList<Product> ();
    public ProductList() {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        InputStream url = getClass().getResourceAsStream("inventory.xml");
        Document doc = db.parse(url);
        doc.getDocumentElement().normalize();

        // loop through each item
        NodeList items = doc.getElementsByTagName("item"); 
        for (int i = 0; i < items.getLength(); i++){
            Element e = (Element) items.item(i);
            // create the single product from the current item
            Product prod = new Product();
            prod.setHyperLinkParam( e.getAttribute("name").toString() );
            prod.setProductType( getTextValue( e, "productType") );
            // add it to the list
            pl.add( prod );
        }
    }

    void showList(){
        for( Product prod: pl ){
        System.out.print("getHyperLinkParam: " + prod.getHyperLinkParam());
            System.out.println("getProductType: " + prod.getProductType());
        }
    }
}