добавление объектов в связанный список / массив в Java - PullRequest
1 голос
/ 03 июля 2011

Я создал класс хранения и использую в качестве типа данных для моего массива / связанного списка.

private LinkedList bid_history;

Я инициализировал это в моей конструкции как

bid_history=new LinkedList <Bid_History> ();

Я добавляю новые элементы в список, используя команду add, как показано ниже

bid_history.add(new Bid_History(bid_count,unit_price,bid_success));

После 'n' итераций я проверил содержимое списка и обнаружил, что список содержит 'n' элементов, но они были одинаковыми. последний добавленный элемент занял весь список. Это как если бы я добавил ссылочную переменную в список?

Есть идеи, где я мог ошибиться? Я также использовал arraylist, та же проблема. Я предполагаю, что я сделал что-то не так с указателями доступа! но у меня нет идей .....

---- Добавлено ------- Я использую рекурсивную функцию

bid()
{
   int bid,quantity;
        bid_success=false;
        bid_count++;
        System.out.println("Starting to bid, Bid ID:"+bid_count);
        quantity=(int)(rated_power*duration/60);
        if(bid_history.isEmpty())
        {
            unit_price=10;
        }
        else
        {
            unit_price++;
        }
        bid=unit_price*quantity;
        //Sending the calculated bid
        send_res(unit_price,quantity,500);
        long startTimeMs = System.currentTimeMillis( );
        System.out.println("Time:"+startTimeMs);
        while(!(System.currentTimeMillis( )>(startTimeMs+2000)));
        System.out.println("Time at end:"+System.currentTimeMillis( ));

        bid_history.add(new Bid_History(bid_count,unit_price,bid_success));

        if(bid_success!=true)
        {
            bid();
        }
}

код печати выглядит следующим образом

int count=0,size;
size=bid_history.size();
while(count<size)
System.out.println(((Bid_History)bid_history.get(count++)).getBid_amount());

Ответы [ 3 ]

5 голосов
/ 03 июля 2011

Другая возможность состоит в том, что BidHistory (количество, цена, успех) не выполняет правильную работу и не устанавливает правильные поля. Я не хочу догадываться, но может случиться так, что вместо полей в BidHistory вы используете статические поля count / price / success в классе.

Конструктор должен выглядеть так («this.» Важно):

public BidHistory(int count, float price, boolean success) {
    this.count = count;
    this.price = price;
    this.success = success;
}
0 голосов
/ 03 июля 2011

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

private final List<BidHistory> bidHistory = Lists.newLinkedList();

final гарантирует, что список не может быть заменен другим списком.Универсальный предотвращает случайное добавление несовместимых объектов в список.Это также облегчает зацикливание списка.Класс Lists из Google Guava сохраняет код коротким, поскольку вам не нужно дважды упоминать общий тип данных.

Все поля в классе BidHistory также должны быть сделаны finalпоэтому вы не можете изменить их позже.Поскольку речь идет об истории, вы все равно не сможете изменить факты позже.

private void printHistoryForDebugging() {
  for (BidHistory bid : bidHistory) {
    System.out.println(bid.getBidAmount() + " (hashCode " + System.defaultHashCode(bid) + ")");
  }
}

Я решил напечатать defaultHashCode каждой заявки, чтобы проверить, являются ли объекты одинаковыми или нет.Для не одинаковых объектов также очень вероятно, что defaultHashCode будет другим.

0 голосов
/ 03 июля 2011

Единственное объяснение вашей проблемы, которое я могу придумать, состоит в том, что значения bid_count, unit_price и bid_success не меняются в каждой итерации.

...