Java静态方法ArrayList

Java静态方法ArrayList,java,Java,我有两道菜,叫水果和球。对于它们中的每一个,一个属性就是价格。我需要做一个静态的方法,从一个混合中返回一个只有最小价格的元素。我有对象f1,f2,f3,b1,b2,b3 我制作了一个如下的ArrayList列表: { Fruit f1 = new Fruit("Apple", "Red", "Summer", 9.5); ... Ball b1 = new Ball("Red", "Stripes", 10.5); ... ArrayList list = new ArrayLi

我有两道菜,叫水果和球。对于它们中的每一个,一个属性就是价格。我需要做一个静态的方法,从一个混合中返回一个只有最小价格的元素。我有对象f1,f2,f3,b1,b2,b3

我制作了一个如下的ArrayList列表:

{ Fruit f1 = new Fruit("Apple", "Red", "Summer", 9.5);
  ...
  Ball b1 = new Ball("Red", "Stripes", 10.5);
  ...
  ArrayList list = new ArrayList();
  list.add(f1);
  list.add(b1);
  ...
}
static void method(ArrayList list) {
for (int i = 0; i < lista.size(); i++) {
}
    Apple apple = new Apple();
    RedBall redBall = new RedBall();

    ArrayList<Price> items = new ArrayList<Price>();
    items.addAll(apple, redBall); 
现在关于我要做的方法,我是这样开始的:

{ Fruit f1 = new Fruit("Apple", "Red", "Summer", 9.5);
  ...
  Ball b1 = new Ball("Red", "Stripes", 10.5);
  ...
  ArrayList list = new ArrayList();
  list.add(f1);
  list.add(b1);
  ...
}
static void method(ArrayList list) {
for (int i = 0; i < lista.size(); i++) {
}
    Apple apple = new Apple();
    RedBall redBall = new RedBall();

    ArrayList<Price> items = new ArrayList<Price>();
    items.addAll(apple, redBall); 
静态无效方法(ArrayList列表){
对于(int i=0;i
我被从数组中取出元素和用于查找每个元素的价格的getter的组合所困扰。你能帮我吗


即使你不明白我想做什么,你能帮我介绍一些混合不同元素的技巧吗?谢谢!

所以你遇到的问题是你没有键入列表,创建一个
新ArrayList()
而不指定类型在功能上与创建一个
新ArrayList()相同
。然后从该列表中调用项目时,将返回一个
对象
,该对象没有
price
属性

通过streams的实现,您可以找到一个相当简单的解决方案:

double minFruitPrice = Stream.of(f1, f2, f3)
                          .reduce((acc, val) -> acc.price < val.price ? acc : val)
                          .orElseThrow(() -> new RuntimeException("No fruits provided!")) // reduce with 1 argument returns an optional
                          .getPrice(); // Always use a getter
然后创建您的
水果
对象,它们将扩展该类(接受其属性)

然后在上面给出的streams实现中使用这些对象:

Stream.of(f1, f2, f3, b1, b2, b3)
    .reduce((acc, val) -> acc.getPrice() < val.getPrice() ? acc : val);
(f1、f2、f3、b1、b2、b3)流 .reduce((acc,val)->acc.getPrice()
它将以最低的价格返回一个
PricedItem
。然后您可以调用
.get()
从可选项中获取值,尽管使用
orElse
选项更安全。

所以您遇到的问题是您没有键入列表,而是创建了一个
新的ArrayList()
不指定类型在功能上与创建
新ArrayList()
相同。然后从该列表中调用项目时,将返回一个
对象
,该对象没有
价格
属性

通过streams的实现,您可以找到一个相当简单的解决方案:

double minFruitPrice = Stream.of(f1, f2, f3)
                          .reduce((acc, val) -> acc.price < val.price ? acc : val)
                          .orElseThrow(() -> new RuntimeException("No fruits provided!")) // reduce with 1 argument returns an optional
                          .getPrice(); // Always use a getter
然后创建您的
水果
对象,它们将扩展该类(接受其属性)

然后在上面给出的streams实现中使用这些对象:

Stream.of(f1, f2, f3, b1, b2, b3)
    .reduce((acc, val) -> acc.getPrice() < val.getPrice() ? acc : val);
(f1、f2、f3、b1、b2、b3)流 .reduce((acc,val)->acc.getPrice()
它将以最低的价格返回<代码> PRICEDIDENTION/CODE >。然后可以调用<代码> .GET()/代码>从可选的值中获得,虽然使用<代码> ORSER < /代码>选项更安全。

很少有需要考虑的点。

  • 拥有一个混合类型的集合是一种糟糕的做法,因为您的示例中的列表可能会在以后(由于您或其他合作开发人员的错误)被修改以添加Employee类、Student类或任何其他类的对象。尽管您希望列表中只有Fruit and Ball对象
  • 因此,遵循这一原则,让我们创建一个包含特定类型对象的ArrayList。让我们将此类型称为
    (最简单的名称,您可以选择更多上下文名称) 最好把它变成一个接口,同样因为我们需要访问price,所以让我们有一个函数(我们在Java中调用的方法)命名为
    getPrice()
    。实现类Ball和Fruit将实现此方法并返回
    price
    属性

    但是我们需要在列表中包含Ball和Fruit,所以让我们通过这两个类来实现interface
    Item

    我们的ArrayList现在将是

    ArrayList < Item > list  = new ArrayList<>();
    
    ArrayListlist=newarraylist();
    
    此ArrayList能够添加Ball和Fruit对象,因为这两个类都实现了接口

  • 您需要在列表中添加数组的元素,而不是添加数组的引用(如您的问题所示)。 简单方法:在for循环中迭代水果数组,并将每个水果添加到ArrayList中。类似地,将Ball数组的元素添加到同一ArrayList中

  • 现在迭代类型项的ARAYLIST并访问<代码> GETPRICE()>代码>,希望您的工作将完成。

    < P> >
  • 拥有一个混合类型的集合是一种糟糕的做法,因为您的示例中的列表可能会在以后(由于您或其他合作开发人员的错误)被修改以添加Employee类、Student类或任何其他类的对象。尽管您希望列表中只有Fruit and Ball对象
  • 因此,遵循这一原则,让我们创建一个包含特定类型对象的ArrayList。让我们将此类型称为
    (最简单的名称,您可以选择更多上下文名称) 最好把它变成一个接口,同样因为我们需要访问price,所以让我们有一个函数(我们在Java中调用的方法)命名为
    getPrice()
    。实现类Ball和Fruit将实现此方法并返回
    price
    属性

    但是我们需要在列表中包含Ball和Fruit,所以让我们通过这两个类来实现interface
    Item

    我们的ArrayList现在将是

    ArrayList < Item > list  = new ArrayList<>();
    
    ArrayListlist=newarraylist();
    
    此ArrayList能够添加Ball和Fruit对象,因为这两个类都实现了接口

  • 您需要在列表中添加数组的元素,而不是添加数组的引用(如您的问题所示)。 简单方法:在for循环中迭代水果数组,并将每个水果添加到ArrayList中。类似地,将Ball数组的元素添加到同一ArrayList中

  • 现在迭代Item类型的ArrayList并访问
    getPrice()
    ,希望您的工作能够完成。

    如果水果和球有价格,您应该
        Apple apple = new Apple();
        RedBall redBall = new RedBall();
    
        ArrayList<Price> items = new ArrayList<Price>();
        items.addAll(apple, redBall);