Как распечатать элемент списка на основе его статуса?

#java #list #for-loop #arraylist

#java #Список #для цикла #arraylist

Вопрос:

Я создаю систему аукционов, и у меня есть метод просмотра аукционов. Каждый аукцион имеет статус (ОТКРЫТЫЙ или ЗАКРЫТЫЙ), и я хочу, чтобы метод browseAuctions распечатывал только открытые аукционы.

Я пробовал несколько операторов if, и он всегда продолжает распечатывать каждый отдельный аукцион.

Следующий код — это несколько вещей, которые я жестко запрограммировал для тестирования системы

 public List<Auction> auctionSystem() throws Exception {
    List<Auction> auctions = new LinkedList<Auction>();
    auctions.add(new Auction (35.50, 75.50, 40.00, users.get(3), LocalDateTime.now().minusSeconds(60), "Xbox", users.get(1), Status.OPEN));
    auctions.add(new Auction (27.00, 42.00, 32.00, users.get(2), LocalDateTime.now().plusSeconds(10), "PS3", users.get(1), Status.OPEN));
    auctions.add(new Auction (19.00, 21.00, 50.00, users.get(2), LocalDateTime.now().minusSeconds(1), "iPhone", users.get(1), Status.CLOSED));
    return auctions;
}
  

Это конструктор класса Auction:

 public Auction (double startPrice, double reservePrice, double currentBid, User highestBidder, LocalDateTime closeDate, String item, User seller, Status status) throws Exception {
    if (closeDate.isBefore(LocalDateTime.now().plusDays(7))) {
        this.startPrice = startPrice;
        this.reservePrice = reservePrice;
        this.closeDate = closeDate;
        this.item = item;
        this.highestBidder = highestBidder;
        this.currentBid = currentBid;
        this.seller = seller;
        UP = currentBid * 0.20;
        LOW = currentBid * 0.10;
    } else {
        throw new Exception ("CloseDate error: "   closeDate.format(formatter));
    }
}
  

Это Status класс:

 public enum Status {
    OPEN, CLOSED
}
  

Это метод внутри Auction класса для просмотра аукционов:

 public void browseAuctions () {

    System.out.println("-----All Auctions-----");

    for (Auction a : auctions) {
        if (a.status.equals(Status.OPEN)){  
            System.out.println("Item: "   a.getItem());
            System.out.println("Current Bid: "   "£"   a.getCurrentBid());
            System.out.println("Close Date: "   a.getCloseDate());
            }
        }
    }
}
  

Ответ №1:

В status конструкторе игнорируется, поэтому все Auction экземпляры не должны быть квалифицированы в соответствии с условием в цикле. Интересно, все проходит, и единственное объяснение заключается в том, что значение Status.OPEN установлено по умолчанию, это означает, что у вас есть следующее объявление в коде:

 private Status status = Status.OPEN;
  

Поскольку он отсутствует в конструкторе, ему не присваивается новое переданное значение. Это проблемы с изменяемыми полями, поэтому я предлагаю вам объявить их final и разрешить значение по умолчанию с помощью вторичного конструктора:

 private final Status status;
// the rest

public Auction (double sPrice, double rPrice, double currentBid, 
                User highestBidder, LocalDateTime closeDate, String item, User seller) 
{
    this(sPrice, rPrice, currentBid, highestBidder, closeDate, item, seller, Status.OPEN)
}
  

В любом случае, чтобы устранить вашу проблему, заполните конструктор:

 this.status = status;