2015-11-15 4 views
2

Я использую Netbeans, и я написал метод, который не делает именно то, что он должен:ошибка или логическая ошибка

private ArrayList<String[]>ProductsInStock; 

public void DisplayStock() { 
    ArrayList<String[]> Sort = new ArrayList<String[]>(); 
    System.out.println(""); 
    for (int i = 0; i < ProductsInStock.size(); i++) { 
     if (ProductsInStock.get(i)[2].equals(Products.get(ProductCodeCB.getSelectedIndex())[1])) { 
      boolean foundColor = false; 
      int size = Sort.size();//Since the size will differ dynamically 
      for (int k = 0; k < size; k++) { 
       if (Sort.get(k)[3].equals(ProductsInStock.get(i)[3])) { 
        foundColor = true; 
        if (Sort.get(k)[4].equals(ProductsInStock.get(i)[4])) { 
         String S[] = Sort.get(k); 
         S[5] = (Integer.parseInt(Sort.get(k)[5]) + Integer.parseInt(ProductsInStock.get(i)[5])) + ""; 
         Sort.set(k, S); 
         break; 
        } 
        if (k == Sort.size() - 1) { 
         Sort.add(ProductsInStock.get(i)); 
        } 
       } else if (foundColor == true) { 
        Sort.add(k, ProductsInStock.get(i)); 
        break; 
       } 
      } 
      System.out.print(ProductsInStock.get(0)[5]+" "); 
      if (foundColor == false) { 
       Sort.add(ProductsInStock.get(i)); 
      } 
     } 
    } 
} 
} 

Метод НЕ должен изменить значение ProductsInStock.get (0) [ 5], но он увеличивает его на 1 каждый раз, когда вызывается метод, я поместил «System.out.println()», чтобы показать вам, как значение действительно меняется. Вот результаты: 1 1 1 1 1 1 1 1 2 И когда я добавил строку «S [5] = ProductsInStock.get (i) [5];», результат был изменен на: 1 1 1 1 1 1 1 1 1 (как это должно быть):

public void DisplayStock() { 
    ArrayList<String[]> Sort = new ArrayList<String[]>(); 
    System.out.println(""); 
    for (int i = 0; i < ProductsInStock.size(); i++) { 
     if (ProductsInStock.get(i)[2].equals(Products.get(ProductCodeCB.getSelectedIndex())[1])) { 
      boolean foundColor = false; 
      int size = Sort.size();//Since the size will differ dynamically 
      for (int k = 0; k < size; k++) { 
       if (Sort.get(k)[3].equals(ProductsInStock.get(i)[3])) { 
        foundColor = true; 
        if (Sort.get(k)[4].equals(ProductsInStock.get(i)[4])) { 
         String S[] = Sort.get(k); 
         S[5] = (Integer.parseInt(Sort.get(k)[5]) + Integer.parseInt(ProductsInStock.get(i)[5])) + ""; 
         Sort.set(k, S); 
         S[5]=ProductsInStock.get(i)[5]; //<<<<HERE>>>> 
         break; 
        } 
        if (k == Sort.size() - 1) { 
         Sort.add(ProductsInStock.get(i)); 
        } 
       } else if (foundColor == true) { 
        Sort.add(k, ProductsInStock.get(i)); 
        break; 
       } 
      } 
      System.out.print(ProductsInStock.get(0)[5]+" "); 
      if (foundColor == false) { 
       Sort.add(ProductsInStock.get(i)); 
      } 
     } 
    } 
} 

Как вы можете видеть, там нет ни одного "ProductsInStock.set()" или "ProductsInStock.get() [] =" изменить любое значение в арраист.

ответ

3

Когда вы пишете это:

Sort.add(ProductsInStock.get(i)); 

вы добавляете ссылку в ProductsInStock.get(i) массива в Sort списке. Любые изменения, сделанные в Sort.get(Sort.size()-1), повлияют на исходный массив.

Поэтому код, такой как

String S[] = Sort.get(k); 
S[5] = ... 

изменяет один из массивов ProductsInStock списка.

Для того, чтобы избежать этого, вы должны создать копию массива перед добавлением его в другой список:

Sort.add(Arrays.copyOf(ProductsInStock.get(i),ProductsInStock.get(i).length)); 
+0

Ohhhhhhhh, теперь это то, что они не учат вас каждодневные спасибо !!! отчислять Btw мне всегда нужно сделать копию массива (Пример: int i [] = j, где j - другой целочисленный массив) – Elio

Смежные вопросы