Распечатка правильной комбинации после сравнения параметров нескольких элементов - PullRequest
1 голос
/ 28 октября 2019

Нам дали следующее упражнение, где желаемый результат - распечатать наиболее ценную комбинацию «сокровищ» (также может быть только одну, если она содержит наибольшее значение и правильный размер) для данного размера мешка:

public class Treasure {
    private String name;
    private Integer size;
    private Double value;

    public Treasure(String name, Integer size, Double value) {
        this.name = name;
        this.size = size;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
        this.size = size;
    }

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    //can also create new methods inside this class

    @Override
    public String toString() {
        return "Treasure [name=" + name + ", size=" + size + ", value=" + value + "]";
    }

}
import java.util.ArrayList;
import java.util.List;

public class Thief {

    public static void main(String[] args) {
        Thief thief = new Thief();
        List<Treasure> treasuresList = thief.fillTreasures();
        List<Treasure> sack = thief.steal(30, treasuresList);
        thief.printTreasures(sack);
    }

    private List<Treasure> fillTreasures() {
        List<Treasure> treasuresList = new ArrayList<Treasure>();

        treasuresList.add(new Treasure("Ring", 1, 450d));
        treasuresList.add(new Treasure("Necklace", 1, 400d));
        treasuresList.add(new Treasure("Jewel", 4, 100d));
        treasuresList.add(new Treasure("Coin", 4, 200d));
        treasuresList.add(new Treasure("Bracelet", 5, 550d));
        treasuresList.add(new Treasure("Pistol", 5, 1000d));
        treasuresList.add(new Treasure("Clock", 10, 450d));
        treasuresList.add(new Treasure("Glass", 15, 1000d));
        treasuresList.add(new Treasure("Telescope", 30, 3100d));
        treasuresList.add(new Treasure("Gold", 35, 3500d));
        treasuresList.add(new Treasure("Silver", 33, 3300d));
        treasuresList.add(new Treasure("Bronze", 31, 3100d));

        return treasuresList;
    }

    public List<Treasure> steal(int sackSize, List<Treasure> treasuresList) {
        //my effort so far
        for (int i = 0; i < treasuresList.size(); i++) {
            Treasure treasure = treasuresList.get(i);

            //removes those whose size is greater than the sack
            if (treasure.getSize() > sackSize) {
                treasuresList.remove(i--);
            }

            //don't really know how to proceed from this point on

        }

        return treasuresList;
    }

    private void printTreasures(List<Treasure> treasuresList) {
        for (int i = 0; i < treasuresList.size(); i++) {
           Treasure treasure = treasuresList.get(i);
           System.out.println(treasure);
        }
    }
}

Таким образом, в данном конкретном случае, когда размер мешка равен 30, на выходе должно быть:

Treasure [name=Ring, size=1, value=450.0]
Treasure [name=Coin, size=4, value=200.0]
Treasure [name=Bracelet, size=5, value=550.0]
Treasure [name=Pistol, size=5, value=1000.0]
Treasure [name=Glass, size=15, value=1000.0]

Поскольку комбинация этих сокровищ дает наибольшее значение дляс учетом размера мешка.

Любая идея, как решить эту проблему и написать логику, будет принята с благодарностью.

...