2013-05-07 57 views
-2

我在Java開發新的,我想這個節目:添加到ArrayList的在Java中

List<String> myList = new ArrayList<String>(); 
    for(int i = 0;i<ProductNumber;i++) 
    { 
     myList.add(mProducts[i].Name); 
    } 
    mProducts[1].Name = "Hello"; 

當我創造println顯示myList中內容:

預計

「A」
「B」
「C」

當前

>"A" 
>"Hello" 
>"C" 

誰能告訴我是怎麼回事?

這是我做的代碼:

public class xmlParsing 
    { 
    private final static String XML_FILE_NAME = "Configuration.xml"; 
    private final static String PRODUCT_NODE = "product"; 
    private final static String TASK_NODE = "task"; 
    private final static String NAME_ITEM = "name"; 
    private final static String DURATION_ITEM = "duration"; 
    private final static String RATE_ITEM = "rate"; 

    private static int ProductNumber = 0; 
    private static int TaskNumber = 0; 
    private static Product mProducts[] = new Product[Product.MAX_PRODUCT_NUMBER]; 

    public xmlParsing() 
    { 
    } 

    public void parseXML() 
    { 
     Product[] Products = new Product[Product.MAX_PRODUCT_NUMBER]; 
     try 
     { 
      File xmlFile = new File(XML_FILE_NAME); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
      Document doc = dBuilder.parse(xmlFile); 
      doc.getDocumentElement().normalize(); 
      NodeList productsNode = doc.getElementsByTagName(PRODUCT_NODE); 
      ProductNumber = productsNode.getLength(); 
      Product mproduct = new Product(); 
      Task mtask = new Task(); 
      for (int i = 0; i < productsNode.getLength(); i++) 
      { 
       Node productNode = productsNode.item(i); 
       if (productNode.getNodeType() == Node.ELEMENT_NODE) 
       { 
        Element element1 = (Element) productNode; 
        mproduct.Name = getValue(NAME_ITEM, element1); 
        NodeList tasksNode = element1.getElementsByTagName(TASK_NODE); 
        TaskNumber = tasksNode.getLength(); 
        Task[] Tasks = new Task[Task.MAX_TASKS_NUMBER]; 
        for (int j = 0; j < tasksNode.getLength(); j++) 
        { 
         Node taskNode = tasksNode.item(j); 
         if (taskNode.getNodeType() == Node.ELEMENT_NODE) 
         { 
          Element element2 = (Element) taskNode; 
          mtask.Name = getValue(NAME_ITEM, element2); 
        mtask.Duration = Double.parseDouble(getValue(DURATION_ITEM, element2)); 
          mtask.Rate = Double.parseDouble(getValue(RATE_ITEM, element2)); 
          Tasks[j] = new Task(mtask); 
         } 
        } 
        mproduct.Tasks = Tasks; 
        Products[i] = new Product(mproduct); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
     mProducts = Products; 
    } 

    private static String getValue(String tag, Element element) 
    { 
     NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes(); 
     Node node = (Node) nodes.item(0); 
     return node.getNodeValue(); 
    } 

    public static List<String> getProdcutNames() 
    { 
     String ps[] = new String[ProductNumber]; 
     List<String> myList = new ArrayList<String>(); 
     for(int i = 0;i<ProductNumber;i++) 
     { 
      ps[i] = mProducts[i].Name; 
      myList.add(new String(mProducts[i].Name)); 
     } 
     mProducts[2].Name = "Hello"; 
     return myList; 
    } 

    public int getProductNumber() 
    { 
     return ProductNumber; 
    } 

    public int getTasktNumber() 
    { 
     return TaskNumber; 
    } 
    } 

    public class Task { 
    public static final int MAX_TASKS_NUMBER = 100; 
    public String Name; 
    public double Duration; 
    public double Rate; 

    public Task(){ 
     Name = ""; 
     Duration = 0; 
     Rate = 0; 
    } 

    public Task(Task t){ 
     Name = t.Name; 
     Duration = t.Duration; 
     Rate = t.Rate; 
    } 

    } 

    public class Product { 
    public static final int MAX_PRODUCT_NUMBER = 200; 
    public String Name; 
    public Task[] Tasks; 

    public Product(){ 
     Name = ""; 
     Tasks = null; 
    } 

    public Product(Product p){ 
     Name = p.Name; 
     Tasks = p.Tasks; 
    } 
    } 


    public class Production { 

    public static void main(String[] args) { 
     xmlParsing parser = new xmlParsing(); 
     parser.parseXML(); 
     for(int i=0;i<parser.getProductNumber();i++) 
      System.out.println(parser.getProdcutNames().get(i)); 

    } 
    } 

XML文件

<product> 
    <name>1510</name> 
    <task> 
     <name>DECOUPAGE PRESSE 250T</name> 
     <duration>1</duration> 
     <rate>144</rate> 
    </task> 
    <task> 
     <name>LAMINAGE PARBOLIQUE 1</name> 
     <duration>0</duration> 
     <rate>72.1</rate> 
    </task> 
    </product> 
    <product> 
    <name>2020</name> 
    <task> 
     <name>DECOUPAGE PRESSE 250T</name> 
     <duration>1</duration> 
     <rate>144</rate> 
    </task> 
    <task> 
     <name>LAMINAGE PARBOLIQUE 1</name> 
     <duration>0</duration> 
     <rate>72.1</rate> 
    </task> 
    </product> 

預計:1510 2020 當前1510你好

+1

不能複製你的行爲。發佈代碼示例可能會有所幫助。 – 2013-05-07 21:39:27

+0

我猜想myProducts包含名稱值爲「A」,「Hello」和「C」的條目。 – 2013-05-07 21:54:15

+1

您是在打印mProducts嗎? – 2013-05-07 21:55:03

回答

2

看起來好像mProductsmyList是指的是同一個對象,但是在你給的代碼中,這是不可能發生的。您是否簡化了代碼,刪除了類似mProducts = myList的內容?

+0

或者'mList.Name'和'mProducts.Name'引用同一個對象 – 2013-05-07 21:48:22

+3

@ A.E.Drew:但是Java字符串是不可變的。 – RichieHindle 2013-05-07 21:55:30

+0

@RichieHindle除非我錯了,我看到一個對象實例中的字段賦值,它既是數組又是列表? 'String'引用不是不可變的... – 2013-05-07 22:10:30

0

更改您這樣的代碼,它應該達到目的

List<String> myList = new ArrayList<String>(); 
for(int i = 0;i<ProductNumber;i++) 
{ 
    myList.add(new String(mProducts[i].Name)); 
} 
mProducts[1].Name = "Hello"; 
+0

我試過了,我仍然有問題 – ARM 2013-05-07 22:02:32

+1

@ user1955287無論你嘗試進行這些細微的更改,問題出現在未發佈的代碼中。 – 2013-05-07 22:11:16

+0

@ user1955287 - 不確定您的「未發佈的代碼」是什麼意思。如果仔細查看myList.add(new String(mProducts [i] .Name)),我做了一個小改動。在你的代碼中,你傳遞對List的引用,這意味着myList中的對象和mProducts [i] .Name將指向同一個對象,這就是我將其更改爲新String的原因(mProducts [i] .Name) – sagar 2013-05-07 22:29:52

0

感謝張貼您的完整代碼。問題是,你打電話getProdcutNames()(你有在名稱中有錯字,順便)多次在main() - 輪main循環每次你再打電話getProdcutNames()

for(int i=0;i<parser.getProductNumber();i++) 
    System.out.println(parser.getProdcutNames().get(i)); 

所以第一當您撥打getProdcutNames(),mProducts通過行mProducts[2].Name = "Hello";被修改,然後當getProdcutNames()被再次調用時,您從修改版本複製到myList

的簡單的解決辦法,這也使得代碼更高效,是隻在main()調用getProdcutNames()一次:

List<String> names = parser.getProdcutNames(); 
for(int i = 0; i < names.size() ;i++) 
    System.out.println(names.get(i)); 
+0

它的工作正常!謝謝您的幫助 – ARM 2013-05-08 14:10:42