Как отобразить список объектов с одинаковым атрибутом?

avatar
bnbored
8 августа 2021 в 20:36
101
4
0

Я все еще новичок в Java и изучаю, как все работает, и в настоящее время я застрял в своем проекте.

Я создал класс Java для хранения объектов (автомобилей) со следующими атрибутами:

  • сделать
  • модель
  • цвет
  • пробег
  • цена

Я дошел до отображения всех этих объектов и их сортировки по одному из их атрибутов (по возрастанию или по убыванию).

Однако я пытаюсь найти способ отображать только те автомобили, которые соответствуют определенному атрибуту, скажем, цвету ("Я хочу отображать только зеленые автомобили"), и мне нужно будет отсортировать их потом ("Только зеленые автомобили, отсортированные по пробегу").

Я просматривал руководства и фрагменты кода, но не могу понять, как этого добиться.

Может ли кто-нибудь указать мне правильное направление? Какой метод/функцию следует использовать?

Источник
Bahij.Mik
8 августа 2021 в 20:37
1

Покажите нам работу, которую вы сделали

JayC667
8 августа 2021 в 20:38
1

Покажите нам свой код, чтобы нам было проще вам помочь, посмотреть, какое решение соответствует вашему коду, и чтобы у вас было готовое решение, не требующее адаптации.

Karl Knechtel
8 августа 2021 в 21:01
1

Можете ли вы написать код, который сообщает вам, следует ли отображать данный экземпляр? Можете ли вы написать код, применяющий одну и ту же логику ко всем экземплярам? Учитывая эти два шага, можете ли вы решить проблему? Если нет, то почему? Что произошло, когда вы попытались написать код для решения проблемы? Ожидается, что вы попытаетесь решить проблему. Мы можем помочь вам выбраться из тупика только в том случае, если вы покажете нам, где вы застряли.

Ответы (4)

avatar
space-ninja-x
9 августа 2021 в 02:52
0

Не видя вашего кода, довольно сложно понять, где вы ошиблись.

Однако, используя ваше объяснение, я получил то, что мог - вы хотите получить все объекты Car, которые имеют общий определенный атрибут. Этого можно добиться, проходя через массив, содержащий все объекты Car, и сравнивая, равен ли этот конкретный атрибут (например, цвет) определенному значению (например, зеленому).

        for(int i = 0 ; i < arrayOfCars.length ; i++)
        {
            if(arrayOfCars[i].getColour().equalsIgnoreCase("green"))
            {
            }
        }

И если условие истинно, мы можем сохранить этот объект в ArrayList.

        ArrayList<Car> greenCars = new ArrayList<>() ;
        for(int i = 0 ; i < arrayOfCars.length ; i++)
        {
            if(arrayOfCars[i].getColour().equalsIgnoreCase("green"))
            {
                greenCars.add(arrayOfCars[i]) ;
            }
        }

Вот так! Теперь у вас есть ArrayList, в котором хранятся все автомобили зеленого цвета.

Примечание: вы можете использовать Array вместо ArrayList. Но помните, что при создании Array вы должны определить его размер, а программа не знает, сколько там зеленых автомобилей — поэтому я использовал ArrayList. Конечно, вы можете определить размер Array, в котором хранятся зеленые автомобили, таким же, как размер Array, в котором хранятся все автомобили. Но новый Array может иметь элементы null. Если вы раньше не работали с ArrayList, вам может быть полезно эта.

.

Хорошо, теперь, когда у нас есть ArrayList всех зеленых автомобилей, вы можете отсортировать ArrayList в порядке возрастания или убывания любого из атрибутов Car (например, пробег). Я не собираюсь показывать вам, как это делается, как вы сказали

.

Я дошел до того, что отобразил все эти объекты и отсортировал их по одному из атрибутов (по возрастанию или по убыванию).

Так что да, я уверен, что вы можете сделать это самостоятельно.

Вот основной класс:

import java.util.ArrayList ;

public class CarsMain
{
    public static void main(String[] args) 
    {
        // create an array of Cars
        Car[] arrayOfCars = new Car[4] ;
        arrayOfCars[0] = new Car("red", 14400) ;
        arrayOfCars[1] = new Car("green", 13000) ;
        arrayOfCars[2] = new Car("green", 15000) ;
        arrayOfCars[3] = new Car("blue", 13500) ;

        // use a for loop to get the cars that are green and store them in an ArrayList
        ArrayList<Car> greenCars = new ArrayList<>() ;
        for(int i = 0 ; i < arrayOfCars.length ; i++)
        {
            if(arrayOfCars[i].getColour().equalsIgnoreCase("green"))
            {
                greenCars.add(arrayOfCars[i]) ;
            }
        }

        // display the green cars
        for(int k = 0 ; k < greenCars.size() ; k++)
        {
            System.out.println((k+1) + ". colour = " + greenCars.get(k).getColour() + " | mileage = " + greenCars.get(k).getMileage());
        }
    }
}

А вот класс Car, который я использовал:

class Car
{
    private String make, model, colour ;
    private int mileage, price ;


    public Car(String c, int m)
    {
        this.colour = c ;
        this.mileage = m ;
    }

    public void setColour(String colour)
    {
        this.colour = colour ;
    }

    public void setMileage(int mileage)
    {
        this.mileage = mileage ;
    }

    public String getColour()
    {
        return this.colour ;
    }

    public int getMileage()
    {
        return this.mileage ;
    }
}
avatar
bnbored
9 августа 2021 в 11:57
0

Вау, спасибо всем за ответы, в основном @user1105, @mcroteau и @oleg.cherednik!

Я не предоставил свой код, потому что думал, что вы, ребята, просто скажете мне, какой метод использовать, а не предоставите весь код :-)

Далее:

  • Я попытаюсь добавить свои объекты в список ArrayList: я хочу иметь возможность добавлять новые автомобили в список, и я не уверен, что простой массив будет правильным вариантом, так как мне нужно увеличивать его длину каждый раз, когда я добавить объект.
  • Мне нужно научиться форматировать результаты, чтобы они отображались без скобок и всего такого, создавать новую строку после каждого объекта...

Вот мой код, надеюсь, кто-нибудь найдет его полезным для своих целей. Я использую Android Studio, поэтому кнопки textView...

public class MainActivity extends AppCompatActivity {

Button btnRed, btnBlue;
TextView tvResult;

public static class Car{
    public Car(String color, String model, Integer mileage){
        this.color = color;
        this.model = model;
        this.mileage = mileage;
    }

    String model;
    String color;
    int mileage;

    @Override
    public String toString() {
        return "Car{" +
                "model='" + model + '\'' +
                ", color='" + color + '\'' +
                ", mileage=" + mileage +
                '}';
    }

    // just in case I need it in the future
    public String getModel() {
        return model;
    }

    public String getColor() {
        return color;
    }

    public int getMileage() {
        return mileage;
    }

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // these are buttons and a textview used in my app
    btnBlue = findViewById(R.id.btnBlue);
    btnRed = findViewById(R.id.btnRed);
    tvResult = findViewById(R.id.tvResult);


    Car[] allCarsList = new Car[27];
    allCarsList[0] = new Car("Red", "Mercedes", 124500);
    allCarsList[1] = new Car("Blue", "Mercedes", 45321);
    allCarsList[2] = new Car("Red", "Audi", 76142);
    allCarsList[3] = new Car("Green", "BMW", 210367);
    allCarsList[4] = new Car("Blue", "Peugeot", 97000);
    allCarsList[5] = new Car("Yellow", "Audi", 3451);
    allCarsList[6] = new Car("Red", "BMW", 100320);
    allCarsList[7] = new Car("Green", "BMW", 54677);
    allCarsList[8] = new Car("Red", "Mercedes", 8543);
    allCarsList[9] = new Car("Yellow", "Audi", 342);
    allCarsList[10] = new Car("Blue", "Audi", 4321);
    allCarsList[11] = new Car("Red", "Peugeot", 7242);
    allCarsList[12] = new Car("Green", "BMW", 908);
    allCarsList[13] = new Car("Blue", "Peugeot", 8776);
    allCarsList[14] = new Car("Yellow", "Audi", 90089);
    allCarsList[15] = new Car("Red", "BMW", 145678);
    allCarsList[16] = new Car("Green", "BMW", 24324);
    allCarsList[17] = new Car("Red", "Mercedes", 76598);
    allCarsList[18] = new Car("Red", "Ford", 5564);
    allCarsList[19] = new Car("Blue", "Mercedes", 4336);
    allCarsList[20] = new Car("Red", "Audi", 65543);
    allCarsList[21] = new Car("Green", "BMW", 95634);
    allCarsList[22] = new Car("Blue", "Audi", 23142);
    allCarsList[23] = new Car("Yellow", "Ford", 87334);
    allCarsList[24] = new Car("Red", "Tesla", 2143);
    allCarsList[25] = new Car("Green", "BMW", 675);
    allCarsList[26] = new Car("Red", "Mercedes", 976);

    //when "Blue" button is pressed
    btnBlue.setOnClickListener(new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onClick(View view) {
            ArrayList<Car> blueCars = new ArrayList<>() ;
            for(int i = 0; i < allCarsList.length ; i++){
                if(allCarsList[i].getColor().equalsIgnoreCase("Blue")){
                    blueCars.add(allCarsList[i]);
                }
            }
            Comparator<Car> comparatorMileage = Comparator.comparingInt(Car::getMileage);
            blueCars.sort(comparatorMileage);

            //display the Red Cars list, sorted by mileage on the textview
            tvResult.setText(blueCars.toString());

        }
    });

    //when Red button is pressed
    btnRed.setOnClickListener((new View.OnClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onClick(View view) {
            ArrayList<Car> redCars = new ArrayList<>();
            for(int i = 0; i < allCarsList.length ; i++){
                if(allCarsList[i].getColor().equalsIgnoreCase("Red")){
                    redCars.add(allCarsList[i]);
                }
            }
            Comparator<Car> comparatorMileage = Comparator.comparingInt(Car::getMileage);
            redCars.sort(comparatorMileage);

            //display the Red Cars list, sorted by mileage on the textview
            tvResult.setText(redCars.toString());
        }
    }));

}
avatar
Mike Croteau
9 августа 2021 в 03:20
-1
import java.util.Arrays;
import java.util.List;
import java.util.Comparator;

public class Unicorn {

    public static class Car {
        public Car(String color, String model, Integer mileage) {
            this.color = color;
            this.model = model;
            this.mileage = mileage;
        }

        String model;
        String color;
        Integer mileage;

        public String getColor() {
            return this.color;
        }

        public String getModel() {
            return this.model;
        }

        public Integer getMileage() {
            return this.mileage; }
    }

    public static void main(String[] args) {
        Car bmd = new Car("blue", "BMW", 13);
        Car audi = new Car("blue", "Audi", 10);
        Car volkswagen = new Car("red", "Volkswagen", 142);
        List<Car> cars = Arrays.asList(new Car[]{bmd, audi, volkswagen});

        Comparator<Car> comparator = new Comparator<Car>() {
            @Override
            public int compare(Car a, Car b) {
                return a.getMileage().compareTo(b.getMileage());
            }
        };

        Car[] sortedFiltered = cars.stream()
                .filter((car) -> car.getColor().equals("blue"))
                .sorted(comparator)
                .toArray(Car[]::new);

        for (Car car : sortedFiltered) System.out.println(car.getModel());

    }
}
avatar
oleg.cherednik
8 августа 2021 в 20:43
0

Вы можете использовать stream. Просто отфильтруйте с помощью предиката по цвету, а затем отсортируйте все по пробегу.

public class MavenMain {

    public static void main(String[] args) {
        Predicate<Car> greenCar = car -> "green".equalsIgnoreCase(car.getColor());
        Comparator<Car> sortByMileage = Comparator.comparingInt(Car::getMileage);
        List<Car> cars = List.of();
        List<Car> res = cars.stream()
                            .filter(greenCar)
                            .sorted(sortByMileage)
                            .collect(Collectors.toList());
    }

}

class Car {

    private String make;
    private String model;
    private String color;
    private int mileage;
    private int price;

    public String getColor() {
        return color;
    }

    public int getMileage() {
        return mileage;
    }

}