Как можно отфильтровать товары по цене в java
Как можно отфильтровать товары по цене. Например есть пару продуктов: морковь - 100р, яблоко - 123р,банан - 122р, треугольник - 101р. как можно отфильтровать эти продукты по цене, например: сначала недорогие или наобарот.
У меня в голове это выглядет так: есть 2 массива (в которые можно записывать строковые id). В одном из массивов название товара, а в другом его цена. и у товара и у цены на этот товар одинаковые id (например: название этого товара) после чего в консоль выводится отфильтрованный список продуктов (просто вывод по порядку, изменять массивы не надо)
Ответы (2 шт):
Наверняка есть более изящные способы(как были предложены компараторы, но раз вы с ними не сталкивались, то вот более простая реализация). Можно использовать массив объектов. Например объявим и реализуем класс Продукт
import java.util.ArrayList;
public class Product {
String name;
int price;
public Product(String name, int price) {
this.name = name;
this.price = price;
}
//По таккому же принципу реализуйте нужные вам сортировки
public static ArrayList<Product> cheaperFirst(ArrayList<Product> products) {
//Луюая угодная вам сортировка, писал быстро - поэтому то что помню)
Product buffer;
for (int j = 0; j < products.size() - 1; j++) {
for (int i = 0; i < products.size() - 1; i++) {
if (products.get(i).getPrice() > products.get(i + 1).getPrice()) {
buffer = products.get(i);
products.set(i, products.get(i + 1));
products.set(i + 1, buffer);
i--;
}
}
}
return products;
}
public int getPrice() {
return price;
}
public String getName() {
return name;
}
public void setPrice(int price) {
this.price = price;
}
public void setName(String name) {
this.name = name;
}
}
Ну давайте наши действия будут происходить в классе Main
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Product> products = new ArrayList<>();
for (int i = 0; i < 10; i++) {
products.add(new Product("Товар " + i, 1 - i));
}
for (Product el: products) {
System.out.println(el.name + ", " + el.price);
}
System.out.println("\n");
ArrayList<Product> products1 = Product.cheaperFirst(products);
for (Product el: products1) {
System.out.println(el.name + ", " + el.price);
}
}
}
Я убежден, что нам не нужно 2 массива. Мы сравниваем цену и меняем объекты(имя товара привязано к объекту, поэтому оно переедет по списку вместе с ценой).
Массивы, хешированные коллекции, простенькие реализации... Я на это все смотрю и мне это все простеньким вообще не кажется. Нужны продукты - создаем класс, их описывающий, выглядит так:
class Product {
private final String name;
private final Long cost;
public Product(String name, Long cost) {
this.name = name;
this.cost = cost;
}
public String getName() {
return name;
}
public Long getCost() {
return cost;
}
@Override
public String toString() {
return "Product{" + "name=" + name + ", cost=" + cost + '}';
}
}
Теперь нужен массив из этих продуктов, но лучше колекция, чтобы не заморачиваться с размерами. Осталось затолкать в коллекцию продукты и потом юзать метод сортировки , передавая в него компараторы, описывающие, как именно мы хотим это добро сортировать. Вот и все.
class Main{
public static void main(String[] args) {
List <Product> products = new ArrayList<>();
products.add(new Product("морковь", 10000L));
products.add(new Product("яблоко", 12300L));
products.add(new Product("банан", 12200L));
products.add(new Product("треугольник", 10100L));
products.sort(Comparator.comparingLong(Product::getCost));
System.out.println(products);
products.sort(Comparator.comparingLong(Product::getCost).reversed());
System.out.println(products);
}
}
А если у вас вдруг появляются , к примеру, еще и какие-то услуги, у которых тоже есть цена, но там совсем другой класс, их описывающий, то можно легко создать интерфейс с каким-то больным названием в духе Costable и единственным методом Long getCost(), который будет импелементирован и классом продуктов, и классом услуг (и любым другим, имеющим стоимость). После чего наши коллекции/методы можно типизировать не классом продуктов, а интерфейсом с больным названием и заталкивать туда все, что его имплементит (продукты, услуги итд). Еще и полиморфизм поюзаем))
Не изобретайте велосипеды и не ленитесь пользоваться подсказками. И еще... Деньги всегда считаются только в копейках/центах итд и хранятся в целочисленной (!) переменной и никак иначе!