Метод применим только к одному экземпляру класса вместо ArrayList

#java #arraylist #methods

#java #arraylist #методы

Вопрос:

У меня есть класс 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>)
 

Я знаю, что это может быть очень простой вопрос, но, похоже, я просто не могу в нем разобраться. Это какая-то проблема с видимостью?

Ответ №1:

С этой подписью и реализацией это скорее может быть static функцией, поскольку она не использует никаких членов из объекта current ( this ) . ArrayList<Item> products это, ну ArrayList , не ваш Item тип, поэтому у него нет ваших методов. Кроме того, сравнение String s с == не работает вообще, используйте 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() , или где бы вы ни планировали его использовать)

Ответ №2:

Это должно быть items.getProductsByCategory(category, products); Вы пытаетесь вызвать getProducts... метод для ArrayList объекта.

Ответ №3:

Вы могли бы создать пользовательский ItemList<Item> класс, расширяющий ArrayList<Item> . В этом классе вы можете добавить getProductsByCategory метод. После этого измените переменную products на 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());