2014-11-06 3 views
0

Я только на 8-й неделе Java, поэтому я совершенно новый.ArrayList Declaration - set unknown size

У меня есть класс, который имеет объект ArrayList, список. У меня есть еще один класс под названием TransactionCalc. Я хотел бы, чтобы TransactionCalc имел свой собственный объект ArrayList, называемый arr3. Мне нужно быть таким же большим, как и список. Я знаю, как объявить ArrayList размером не более 10, но как вы это делаете, если еще не знаете точный размер? Является ли это возможным?

public class TransactionCalc extends CalculateAbstract{ 

    private int count = 0; 
    private ArrayList <ItemAttribute> arr3 = new ArrayList <ItemAttribute> (1); 
          //the 1 needs to be list.size() ?? 

Я предполагаю, что в другом классе, мне нужно будет сделать публичный статический окончательный Int = list.size(), но это можно получить, что константа к классу TransactionCalc, так что это может быть в декларация?

Я забыл добавить это ... так как функциональность arrayList на самом деле не нужна, я мог бы также сделать list.toArray(arr3), но это все равно не позволит ему быть объектом класса TransactionCalc. Можно ли это сделать? Я бы хотел, чтобы повторять один и тот же arr3 снова и снова для нескольких методов в одном классе.

Кроме того, как бы я положил это как конструктор?

EDIT с помощью от amaleemur____________

Я обновил свой код, чтобы:

public class FindItemInfo implements InterfacePrint{ 
    ArrayList <ItemAttribute> list = new ArrayList<ItemAttribute>(); 
     //load arraylist and do something with it 
     //sort arraylist 

    public void printPriority(){ 
     TransactionCalc finish = new TransactionCalc(); 
     for (int i = 0; i < list.size(); i++){  
      for (int x = 0; x < list.size(); x++){ 
       if(arr2.get(i) == list.get(x).getPriority()){ 
         finish.cashOut(list.get(x), bankAccount, list.size()); 
       }     //send sorted arr2 to TransactionCalc class 
      } 
     } 

    public static int getListSize(){ 
     return list.size(); 
    } 
} 


public class TransactionCalc {//extends CalculateAbstract{ 
    private int count = 0; 
    //private ArrayList <ItemAttribute> arr3 = new ArrayList <ItemAttribute> (FindItemInfo.getListSize()); 
    private ItemAttribute[] arr3 = new ItemAttribute[FindItemInfo.getListSize()]; 

    public void cashOut (ItemAttribute item, double bankAccount, int size) { 
     //ItemAttribute[] arr3 = new ItemAttribute[size]; 

     double runningTotal = 0; 
     if((runningTotal + (item.getQuantity()*item.getPrice()))<= bankAccount){ 
      runningTotal += item.getQuantity()*item.getPrice(); 
      bankAccount -= runningTotal; 
      System.out.format("You will spend $%.2f on " + item.getQuantity() + " of "+ item.getDescription(), runningTotal); 
      System.out.format(" and have $%.2f left to spend\n", bankAccount); 
     } 
     else{ 
      arr3[count] = item; 
      count++; 
     } 
    } 

творю arr3 объект класса TransactionCalc, поскольку он используется для нескольких методов. Цель массива/arraylist - собирать предметы, которые не печатаются. Я могу использовать массив или arraylist. Сначала я пошел с массивом, но потом не знал размера.

Теперь я получаю статические и нестатические ошибки. Когда я пытаюсь исправить это, это вызывает больше проблем.

+0

Я забыл добавить это ... так как функциональность arrayList на самом деле не нужна, я мог бы также делать list.toArray (arr3), но это все равно не позволяло бы ему быть объектом класса TransactionCalc. Можно ли это сделать? Я бы хотел, чтобы повторять один и тот же arr3 снова и снова для нескольких методов в одном классе. –

+0

Что это в этом классе TransactionCalc, который должен быть сделан с этим вашим списком? Может быть, TransactionCalc может поддерживать методы, которые вы вызываете из первого класса? Если у вас нет полного примера кода/заглушки, по крайней мере, укажите некоторый псевдокод ваших разных классов. – mattias

+0

Вам не нужно устанавливать начальный размер 'ArrayList' и редко хотите. Просто используйте конструктор no argument. –

ответ

1

Неплохая вещь об использовании ArrayList заключается в том, что вам не нужно объявлять размер.

так что этого достаточно, и вы можете добавлять элементы в список массивов.

private ArrayList <ItemAttribute> arr3 = new ArrayList <ItemAttribute>(); 

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

В своем классе, который содержит список ArrayList, создать метод

public int getListSize(){ 

return list.size(); 

} 

и теперь вы можете безопасно доступ к размеру списка. Помогает ли это?

так что теперь вы могли бы сделать это:

private ArrayList <ItemAttribute> arr3 = 
new ArrayList <ItemAttribute>(otherClass.getListSize()); 

где OtherClass является заполнителем для названия вашего другого класса со списком ArrayList.

+0

альтернативно, если список является общедоступным в другом классе, вы можете сделать private ArrayList arr3 = otherClass.list.clone(); – amaleemur

+0

Я пробовал оба, как если бы arr3 был массивом, а также arrayList, поскольку arrayList действительно не нужен. оба дают мне ошибки, не могут статически ссылаться на нестатический список полей. Теперь я редактирую свой оригинальный вопрос, чтобы предоставить дополнительную информацию. –

+0

@JavaNoob поместил полный код на вставку bin или что-то g, чтобы я мог получить к нему доступ и лучше посмотреть. – amaleemur

0

ArrayList - это изменяемый тип коллекции. Это означает (в данном случае), что экземпляры ArrayList могут содержать произвольное количество элементов и, в частности, содержащиеся элементы данного экземпляра ArrayList могут меняться во время выполнения. Поэтому вам не нужно объявлять количество элементов. В типичных случаях вы, скорее всего, захотите использовать по умолчанию c'tor (= не указать начальное количество элементов).Указание начальной суммы, если элементы могут быть хорошей идеей (по производительности), если вы знаете, что во время выполнения будет добавлено большое количество объектов. В таких случаях инициализация экземпляра ArrayList может защитить некоторые выделения памяти от операций memcopy.