我的问题的重点是takeInventory()
方法。
您可以假设InventoryDemo
的{{1}}方法功能正常(除了main()
方法的实现)。
如果您愿意,您可以找到其他课程here。
我的takeInventory()
方法的目标是对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()
个对象进行排序,并报告其唯一类型值的总和成本。这在输出中清楚地证明了。输出的最后一个字符串文字是由我的main()方法中的条件产生的。其余的将由ArrayList
方法生成。
我确定我当前的takeInventory()
不正在工作。
答案 0 :(得分:3)
我会构建一个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
答案 1 :(得分:1)
与@ Zoyd的答案类似,您可以拥有Map<String, List<Product>>
,然后将每个产品添加到地图中,如下所示:
Map<String, List<Product>> productMap = new HashMap<>();
for(Product product : list) {
if (!productMap.containsKey(product.getName())) {
productMap.put(product.getName(), new ArrayList<Product>());
}
productMap.get(product.getName()).add(product);
}
然后在您的打印方法中,您可以遍历地图键集,并将每个列表中的所有产品成本加起来,如下所示:
for(String productName : productMap.keySet()) {
List<Product> products = productMap.get(productName);
int quantity = products.size();
double totalCost = 0.0;
for (Product product : products) {
totalCost += product.getCost();
}
System.out.println(String.format("%s: Quantity = %s, Total cost = %s", productName, quantity, totalCost));
}
答案 2 :(得分:0)
所以一个干净的方法是使用Guava的FluentIterable之一,根据某些规则,谷歌类用于过滤集合。首先制作一个谓词来定义你的排序:
class sorter implements Predicate<Product> {
private final String name;
sorter(String name){
this.name=name
}
@Override
boolean apply(Product input){
return (input.name == this.name)
}
}
如果input.name与为谓词指定的名称相同,则返回true。这与Guava的fluentIterable类一起使用,可以返回谓词为true的所有元素。 E.g。
List<Product> cars = FluentIterable.from(list).filter(new sorter("car"))
将生成名为“car”的所有元素的列表。
由于您将为每个名称迭代一次,因此它可能在大型集合上存在性能问题,另一方面,由于它只是只读且不会改变列表,因此您可以轻松地在本地多线程化。
虽然很容易阅读/维护。