我想通过添加一个由String name, double price, int quantity
组成的代表不同项目的数组来构建一个arraylist。如果添加的项目与arraylist中已经存在的项目相同,则应增加quantity
而不是添加。
我的想法是检查两个数组之间的索引1的值是否匹配,如果匹配,则在第一个数组中递增索引3的值。这可以用Java完成吗?您如何将新数组与列表中已有的数组进行比较?
答案 0 :(得分:3)
正确的方法是构建一个保存这些值的POJO
:
class Purchase {
String name;
// all other
}
并用equals/hashCode
和name
覆盖price
(不要quantity
,因为这是一个可更新的字段),然后将这些实例快速放入Set
搜索。其余的可能很明显。
答案 1 :(得分:2)
您可能应该检查模型并使用一个对象。
创建一个包含三个属性的类。然后是Map<String, YourObject>
。然后,当您要添加对象时,只需先进行测试
if(map.containsKey(objectName)) {
YourObject object = map.get(objectName);
object.setQuantity(object.getQuantity() + 1);
}
编辑与@Eugene讨论
YourObject objectToAdd = ...
Map<String, YourObject> map = new HashMap<>();
...
YourObject objectInMap = map.get(objectName);
if(objectInMap != null) {
// increase Quantity in objectInMap
} else {
//Object not existing in the map, never added
//manage initial quantity here
map.put(objectToAdd.getName(), objectToAdd)
}
答案 2 :(得分:1)
我同意其他答案:步骤1是定义一个表示此类SalesActivity
的类。
但是与其他方法相比,我建议:将此类对象的所有字段定为final。含义:当售出X件商品时,无需递增 amount
字段...只需创建一个 new SalesActivity。
您只需将这些新对象添加到列表中。当您想知道“天哪,售出了X个”时,您只需迭代该列表,对于任何X条目,您都将添加quantity
信息。
当然,这不是您在新手练习中建模的方式。但这就是您应该在现实世界中做事的方式。您避免携带状态的对象。就像您的银行帐户:这不是更改其状态的对象。它不过是一系列不断增加的“帐户活动”。换句话说:帐户对象中没有字段“帐户余额”。但是存入清单和付款清单,余额不过是所有这些事件在特定时间点的“总和”。
答案 3 :(得分:0)
嗯,好吧...我考虑到已经存在的答案写了代码(很无聊)...
您在这里:
public class Helper {
private static List<MyData> addNewData(List<MyData> listOfData, MyData myData) {
for (int i = 0; i <= listOfData.size(); i++) {
if (listOfData.get(i).getName().equalsIgnoreCase(myData.getName())) {
listOfData.get(i).setQuantity(listOfData.get(i).getQuantity() + myData.getQuantity());
break; //the data with the same name is found
} else {
listOfData.add(myData);
break; //also necessary break!!!
}
}
return listOfData;
}
private static void printData(List<MyData> myData){
myData.forEach(System.out::println);
System.out.println("______________________");
}
public static void main(String[] args) {
//test data
List<MyData> testData = new ArrayList<>();
testData.add(new MyData("chair", 15.0, 44));
testData.add(new MyData("bottle", 0.25, 119));
System.out.println("Original data: "); printData(testData);
//try to add new item (with new name)
addNewData(testData, new MyData("glass", 1.1, 10));
//print the new data
System.out.println("New List: "); printData(testData);
//try to add new 'existing' item
addNewData(testData, new MyData("chair", 17.0, 4));
//print the new - new data
System.out.println("NEW new data: "); printData(testData);
}
static class MyData {
private String name;
private double price;
private int quantity;
//constructor without parameters
public MyData() {
this.setName("");
this.setPrice(0.0d);
this.setQuantity(0);
}
//constructor with parameters
public MyData(String name, double price, int quantity) {
this.setName(name);
this.setPrice(price);
this.setQuantity(quantity);
}
//getters, setters...
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
@Override
public String toString(){
return this.name + ", " + this.price + ", " + this.quantity;
}
}
}
输出为:
Original data:
chair, 15.0, 44
bottle, 0.25, 119
______________________
New List:
chair, 15.0, 44
bottle, 0.25, 119
glass, 1.1, 10
______________________
NEW new data:
chair, 15.0, 48
bottle, 0.25, 119
glass, 1.1, 10
______________________
请注意,椅子的价格不变(也可以这样做...)!