该方法仅适用于Class的单​​个实例,而不适用于ArrayList

时间:2019-04-18 13:34:35

标签: java arraylist methods

我有一个items类,其中包含mProductType个字段。

在此类中,有以下方法:

public ArrayList<Item> getProductsByCategory(String category, ArrayList<Item> productList) {

    ArrayList<Item> returnList = new ArrayList<>();

    for (int i = 0; i < productList.size(); i++) {

        if (productList.get(i).getmProductType() == category) {
            returnList.add(productList.get(i));
        }

    }
    return returnList;
}

到目前为止,一切都很好。在我的其他ProductsInCategoryFragment类中,我尝试调用如下方法:

ArrayList<Item> products;

// ... filling variable "products" with content
products = fetcher.getItems();

// ... declaring the category String
String category = getArguments().getString("CATEGORY");


products.getProductsByCategory(category, products);

我可以从类项目的实例中调用该方法,但不能在该类的ArrayList上调用。最后一行代码给我这个错误:

Error:(82, 17) error: cannot find symbol method getProductsByCategory(String,ArrayList<Item>)

我知道这可能是一个非常基本的问题,但我似乎无法理解。这是可见性问题吗?

3 个答案:

答案 0 :(得分:1)

应该为Document,您尝试在items.getProductsByCategory(category, products);对象上调用getProducts...方法。

答案 1 :(得分:1)

使用此签名和实现,它可能更像是static函数,因为它不使用当前(this)对象中的任何成员。 ArrayList<Item> productsArrayList,而不是您的Item类型,这就是为什么它没有您的方法的原因。另外,将String==进行比较通常是行不通的,请改用equals()
所以:

public static ArrayList<Item> getProductsByCategory(String category, ArrayList<Item> productList) {

    ArrayList<Item> returnList = new ArrayList<>();

    for (int i = 0; i < productList.size(); i++) {

        if (category.equals(productList.get(i).getmProductType())) {
            returnList.add(productList.get(i));
        }

    }
    return returnList;
}

用作:

ArrayList<Item> filteredItems = Item.getProductsByCategory(category, products);

(假设getProductsByCategory()Item中的一种方法,但是可能有更好的地方,也许在您的main()附近,或者您打算使用它的任何地方)< / p>

答案 2 :(得分:0)

您可以创建扩展ItemList<Item>的自定义ArrayList<Item>类。在此类中,您可以添加getProductsByCategory方法。然后将您的产品变量更改为ItemList<Item> products;

class ItemList<Item> extends ArrayList<Item> {

  public ArrayList<Item> getProductsByCategory(String category) {
    ArrayList<Item> returnList = new ArrayList<>();
    for (int i = 0; i < this; i++) {
      if (this.get(i).getmProductType().equals(category)) {
        returnList.add(this.get(i));
      }
    }
    return returnList;
  }

}

或者在Java 8中,您可以简单地使用流来根据类别过滤列表,而不必实现自己的getProductsByCategory函数。

List<Item> result = products.stream()
                            .filter(p -> (p.getmProductType().equals(category)))
                            .collect(Collectors.toList());