【问题标题】:How to sum an attribute's object from a stack of objects?如何从一堆对象中总结一个属性的对象?
【发布时间】:2013-08-17 05:07:04
【问题描述】:

我有一个类车,构造函数为

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

然后,在我的 main 中,我将堆栈创建为:

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

我如何从这个堆栈中获得 500 辆汽车(150 辆宝马 + 300 辆丰田 + 50 辆本田)的价格?

【问题讨论】:

  • 在一个循环中迭代你的堆栈并求和!
  • 按照惯例,类名应大写:Car 而不是car

标签: java object stack


【解决方案1】:

步骤:

  • 使用 for 循环遍历堆栈。 Stack 实现了 Iterable 接口,因此 for-each 循环可能是最容易使用的:for (Car myCar: carStack) {...}
  • 对循环中的项目调用 getPrice()
  • 将此添加到已在循环之前声明的 sum 变量
  • Q.E.D.

顺便说一句,为了让您的代码符合 Java 命名标准,您的汽车类应该重命名为 Car。类和接口名称应以大写字母开头。

由于别人在炫耀代码,这里是我的大喊代码sn-p:

double price = 0.0;
for (Car myCar: carStack) {
  price += myCar.getPrice();
}

【讨论】:

  • 当我这样做时,我得到的价格是 (150 BMW + 300 Toyota + 200 Honda)。能拿到(150宝马+300丰田+50本田)的价格吗?
  • @Gantavya:???您将获得已添加到堆栈中的任何内容的价格,不多也不少。期间。
  • 感谢您的精彩解释
【解决方案2】:

您可以在 foreach 循环中迭代您的堆栈:

double price = 0.0;

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

或者您可以在 while 循环中迭代您的堆栈:

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

while (iter.hasNext()) {
    price += iter.next().getPrice();
}

【讨论】:

    【解决方案3】:

    如果你使用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 跟踪项目以及项目在Bag 中出现的次数。这意味着从Car 中删除numberOfCars 字段。

    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 发布时,我们可以将匿名内部类替换为 lambda 或方法引用。下面是带有方法引用的代码的样子。

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

    如果 price 是 double 而不是 int,我们只需将 sumOfInt() 替换为 sumOfDouble()

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

    注意:我是 Eclipse 集合的提交者。

    【讨论】:

      【解决方案4】:
      int total = 0;
      while(!cars.isEmpty()) {
          total += cars.pop().getTotal();
      }
      

      然后是 Car 的 getTotal:

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

      或者如果您想保留堆栈,请执行其他人提到的 foreach。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-31
        • 2011-02-07
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 2020-11-06
        • 2019-04-27
        • 2011-01-26
        相关资源
        最近更新 更多