#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());