我的问题的重点与takeInventory()方法有关。

您可以假定InventoryDemomain()方法是可以起作用的(除了takeInventory()方法的实现)。

如果需要,可以找到其他类here

我的takeInventory()方法的目标是对我的list进行排序,并报告Product类型的每个唯一实例的整数值。

这只能通过名称区分:


  产品(名称,费用)。


名称相同的Product应分组在一起(不考虑费用)。

输出应报告以下内容:



我认为有一种对这些数据进行排序的方法比我目前的方法有效得多。但是,我不知道一个。

import java.util.*;
public class InventoryDemo
{
    public static void main(String [] args) {
        ArrayList<Product> list = new ArrayList<Product>();
        list.add(new Car("Jaguar", 1000000));
        list.add(new Car("Neon", 17000));
        list.add(new Tool("JigSaw", 149.18));
        list.add(new Car("Jaguar", 110000));
        list.add(new Car("Neon", 17500));
        list.add(new Car("Neon", 17875.32));
        list.add(new Truck("RAM", 35700));
        list.add(new Tool("CircularSaw", 200));
        list.add(new Tool("CircularSaw", 150));
        list.add(new Tool("saw1", 200));
        list.add(new Tool("saw2", 150));

        if(list.get(9).compareTo(list.get(10)) == 0) {
            System.out.println("\nBoth saws are of equal value.");
        } else if(list.get(9).compareTo(list.get(10)) > 0) {
            System.out.println("\nThe first saw is more expensive.");
        } else {
            System.out.println("\nThe second saw is more expensive.");
        }

        takeInventory(list);
    }

    public static void takeInventory(ArrayList<Product> list) {
        int inventory[] = new int[list.size()];
        int counter = 0;
        for(Product token: list) {
            for(int x = 0; x < list.size(); x++) {
                if(token.compareTo(list.get(x)) == 0) {
                    inventory[counter] = 0;
                } else {
                    counter++;
                }
            }
        }

        for(int token : inventory) {
            System.out.println(token);
        }
    }
}


如果不清楚,请执行以下操作:

我想对我的takeInventory()方法进行补救。此方法的目的是对给定的对象ArrayList进行分类,并报告其唯一类型值的总和。输出中清楚地显示了这一点。输出的最后一个字符串文字是由我的main()方法中的条件产生的。其余的将通过takeInventory()方法生产。

我确定我当前的takeInventory()无法正常工作。

最佳答案

我将构建一个Map<String, C>,其中C是一个包含数量(int)和成本(double)的帮助程序类。遍历产品列表,并针对每个产品:


如果名称不在地图中,则将该名称关联到new C(1, cost)
如果名称在地图中,则将与名称关联的数量增加1,并将与名称关联的成本增加cost


最后,遍历地图并打印结果;那么就完成了。

参考:http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

这是一些代码:

import java.util.*;

class Product {
    private String name;
    private double cost;

    public Product (String name, double cost) {
        this.name = name;
        this.cost = cost;
    }

    public String getName() {
        return name;
    }

    public double getCost() {
        return cost;
    }
}

class Car extends Product {
    public Car(String name, double cost) {
        super(name, cost);
    }
}

class Truck extends Product {

    public Truck(String name, double cost) {
        super(name, cost);
    }
}

class Tool extends Product {

    public Tool(String name, double cost) {
        super(name, cost);
    }
}



class Entry {
    private int quantity = 1;
    private double cost;

    public int getQuantity() {
        return quantity;
    }

    public double getCost() {
        return cost;
    }

    public Entry(double cost) {
        this.cost = cost;
    }

    public void add (double cost) {
        quantity++;
        this.cost += cost;
    }

    @Override
    public String toString() {
        return ("Quantity = " + quantity + ", Total cost = " + cost);
    }
}


public class Inventory {

    static void takeInventory(List<Product> list) {
        Map<String, Entry> map = new HashMap<>();

        for (Product p : list) {
            Entry e = map.get(p.getName());
            if (e == null) {
                map.put(p.getName(), new Entry(p.getCost()));
            } else {
                e.add(p.getCost());
            }
        }

        for (String s : map.keySet()) {
            System.out.print(s);
            Entry e = map.get(s);
            System.out.println(" " + e);
        }
    }

    public static void main(String [] args) {
        ArrayList<Product> list = new ArrayList<Product>();
        list.add(new Car("Jaguar", 100000));
        list.add(new Car("Neon", 17000));
        list.add(new Tool("JigSaw", 149.18));
        list.add(new Car("Jaguar", 110000));
        list.add(new Car("Neon", 17500));
        list.add(new Car("Neon", 17875.32));
        list.add(new Truck("RAM", 35700));
        list.add(new Tool("CircularSaw", 200));
        list.add(new Tool("CircularSaw", 150));
        list.add(new Tool("saw1", 200));
        list.add(new Tool("saw2", 150));

        takeInventory(list);
    }
}


输出:

saw1 Quantity = 1, Total cost = 200.0
saw2 Quantity = 1, Total cost = 150.0
CircularSaw Quantity = 2, Total cost = 350.0
RAM Quantity = 1, Total cost = 35700.0
JigSaw Quantity = 1, Total cost = 149.18
Jaguar Quantity = 2, Total cost = 210000.0
Neon Quantity = 3, Total cost = 52375.32

10-04 12:37