2013-05-07 2 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

Не удается воспроизвести свое поведение. Возможно, вам может помочь публикация кода. –

+0

Я бы предположил, что myProducts содержит записи с именами значений «A», «Hello» и «C». –

+1

Вы печатаете mProducts вместо этого? –

ответ

2

Это выглядит так, как будто mProducts и myList являются ссылаясь на тот же объект, но в коде, который вы дали, этого не может быть. Вы упростили код, удалив что-то вроде mProducts = myList?

+0

или, может быть, 'mList.Name' и' mProducts.Name' относятся к одному объекту –

+3

@ A.E.Drew: Но строки Java неизменяемы. – RichieHindle

+0

@RichieHindle, если я не ошибаюсь, я вижу назначение в поле экземпляра объекта, который находится как в массиве, так и в списке? Ссылки 'String' не являются неизменяемыми ... –

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

+1

@ user1955287 независимо от того, что вы попробуйте с этими незначительными изменениями, проблема находится где-то еще в вашем незарегистрированном коде. –

+0

@ user1955287 - Не знаете, что вы имели в виду под «кодом, который вы не указали». Я сделал небольшое изменение, если внимательно посмотреть на myList.add (новая строка (mProducts [i] .Name)). В вашем коде вы передаете ссылку на List, что означает объект в myList и mProducts [i] .Name укажет на тот же объект, поэтому я поменял его на новую String (mProducts [i] .Name) – sagar

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.

Самое простое исправление, которое также делает код более эффективным, является только позвонить getProdcutNames() раз в main():

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

Хорошо, он отлично работает! Спасибо за помощь – ARM