我有两个数组字符串列表。我希望能够通过组合2个列表来创建新列表(newList)。但它必须满足这三个条件:
1)将store_inventory的内容复制到newList。
2)然后如果商品名称在store_inventory& new_acquisitions匹配,只需将两个数量相加并在newList中更改它。
3)如果new_acquisitions有一个store_inventory中不存在的新项目,则将其添加到newList。
CSV列表的标题是:项目名称,数量,成本,价格。
列表包含每行的项目名称,数量,成本和价格的字符串[]。
CSVReader from = new CSVReader(new FileReader("/test/new_acquisitions.csv"));
List <String[]> acquisitions = from.readAll();
CSVReader to = new CSVReader(new FileReader("/test/store_inventory.csv"));
List <String[]> inventory = to.readAll();
List <String[]> newList;
让我入门的任何代码都会很棒! =]
这就是我到目前为止......
for (int i = 0; i < acquisitions.size(); i++) {
temp1 = acquisitions.get(i);
for (int j = 1; j < inventory.size(); j++) {
temp2 = inventory.get(j);
if (temp1[0].equals(temp2[0])) {
//if match found... do something?
//break out of loop
}
}
//if new item found... do something?
}
答案 0 :(得分:4)
我首先将newList构建为HashMap或TreeMap而不是List。这样可以轻松搜索匹配的记录。此外,我会将String []转换为包含名称,数量,成本和价格字段的自定义对象(例如Record)。这将负责复制信息。你可以尝试这样的事情:
Map<String, Record> newMap = new TreeMap<String, Record>();
for(String[] ss : acquisitions) {
Record rec = Record.parse(ss); // For requirement (1)
newMap.put(rec.getName(), rec);
}
for(String[] ss : inventory) {
Record rec = Record.parse(ss); // For requirement (1)
if(newMap.containsKey(rec.getName())) {
// For requirement (2)
// The mergeWith method can then add quantities together
newMap.get(rec.getName()).mergeWith(rec);
} else {
// For requirement (3)
newMap.put(rec.getName(), rec);
}
}
修改的
拥有Record对象的另一个好处是,通过实现toString
功能,可以更轻松地将其打印到屏幕上。
public class Record implements Comparable<Record> {
public static Record parse(String[] ss) {
// TODO: implement some basic parsing
}
private String name;
private int quantity;
private BigDecimal cost, price;
private Record() {}
public String getName() { return name; }
public int getQuantity() { return quantity; }
public BigDecimal getCost() { return cost; }
public BigDecimal getPrice() { return price; }
public int compareTo(Record other) {
return this.name.compareTo(other.name);
}
public String toString() {
return name;
}
}