2

私はコンストラクターを持つクラスカーを持っています

public car (String name, int numberOfCars, int price) {}

次に、私のメインでは、スタックを次のように作成しました。

Stack<car>carStack = new Stack<car>();
carStack.push("Honda", 200, 19000));
carStack.push("Toyota", 300, 18000));
carStack.push("BMW", 150, 40000));

このスタックから 500 台の車 (BMW 150 台 + トヨタ 300 台 + ホンダ 50 台) の価格を取得するにはどうすればよいでしょうか?

4

4 に答える 4

1

Eclipse Collectionsを使用している場合は、メソッドを持つMutableStackを使用できますsumOfInt()

Car honda = new Car("Honda", 19000);
Car toyota = new Car("Toyota", 18000);
Car bmw = new Car("BMW", 40000);

MutableStack<Car> carStack =
        ArrayStack.newStackFromTopToBottom(honda, toyota, bmw);

long price = carStack.sumOfInt(new IntFunction<Car>()
{
    @Override
    public int intValueOf(Car eachCar)
    {
        return eachCar.getPrice();
    }
});
Assert.assertEquals(77000, price);

質問は、各車に多数のオカレンスがあることに言及しています。おそらく、BagStackIterable. はアイテムと、そのアイテムが で何回発生したBagかを追跡しますBagnumberOfCarsからフィールドを削除することを意味しCarます。

MutableBag<Car> carBag = HashBag.newBag();
carBag.addOccurrences(honda, 200);
carBag.addOccurrences(toyota, 300);
carBag.addOccurrences(bmw, 150);

long price = carBag.sumOfInt(new IntFunction<Car>()
{
    @Override
    public int intValueOf(Car eachCar)
    {
        return eachCar.getPrice();
    }
});
Assert.assertEquals(15200000, price);

Java 8 がリリースされると、匿名内部クラスをラムダまたはメソッド参照に置き換えることができます。メソッド参照を含むコードは次のようになります。

long price = carBag.sumOfInt(Car::getPrice);

price が int ではなく double の場合は、 に置き換えるだけsumOfInt()で済みsumOfDouble()ます。

long price = carBag.sumOfDouble(Car::getPrice);

注:私は Eclipse コレクションのコミッターです。

于 2013-08-27T16:33:14.863 に答える
1

手順:

  • for ループを使用して Stack を反復処理します。Stack は Iterable インターフェースを実装しているため、おそらく for-each ループが最も使いやすいでしょう:for (Car myCar: carStack) {...}
  • ループ内のアイテムで getPrice() を呼び出します
  • これをループのに宣言された合計変数に追加します
  • QED

余談ですが、コードを Java 命名基準に準拠させるには、car クラスの名前をC ar に変更する必要があります。クラス名とインターフェイス名は大文字で始める必要があります。

他の誰かがコードを見せびらかしているので、ここに私の大きなフープコードスニペットがあります:

double price = 0.0;
for (Car myCar: carStack) {
  price += myCar.getPrice();
}
于 2013-08-15T02:30:48.783 に答える
1

foreach-loop内でスタックを反復できます。

double price = 0.0;

for(Car c : stack)
{
    price += c.getPrice();
}

または、 while-loop内でスタックを繰り返すことができます:

Iterator<Car> iter = carStack.iterator();
double price = 0.0;

while (iter.hasNext()) {
    price += iter.next().getPrice();
}
于 2013-08-15T02:35:13.947 に答える
0
int total = 0;
while(!cars.isEmpty()) {
    total += cars.pop().getTotal();
}

次に、Car の getTotal:

public double getTotal() {
    return price * quantity;
}

または、スタックを保持したい場合は、他の人が言及した foreach を実行します。

于 2013-08-15T03:18:56.960 に答える