我有一个对象数组。每个对象都是客户记录,即客户ID(int),名字(String),姓氏(String)和余额(double)。
我的问题是我不应该有重复的客户记录,所以如果它们出现在文件中两次,我必须更新他们的余额。我无法弄清楚如何搜索数组以确定我是否需要更新余额或在数组中创建新记录。
我觉得我应该在get / setters中这样做,但我不确定。
编辑:澄清" 如果它们在文件中出现两次,我必须更新其余额。"我有一个我在记事本中制作的文件,它应该是一个客户列表,其中包含所有信息。如果同一个客户出现两次,说第二天购买更多的东西,我不应该为他们创建一个新对象,因为他们已经有一个对象和数组中的位置。相反,我应该花费他们花费的金额,并将其添加到他们现有对象中已有的余额中。
edit2:我想我会给你一些代码,我已经把数值读入数组了。我基于我们在课堂上做的例子,但我们没有更新任何东西,只是将信息存储到数组中并在需要时打印它。
public CustomerList(){
data = new CustomerRecord[100]; //i'm only allowed 100 unique customers
try {
Scanner input = new Scanner(new File("Records.txt"));
for(int i = 0; i < 100; ++i){
data[i] = new CustomerRecord();
data[i].setcustomerNumber(input.nextInt());
data[i].setfirstName(input.next());
data[i].setlastName(input.next());
data[i].setTransactionAmount(input.nextDouble());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
答案 0 :(得分:0)
在这种情况下,您不应该使用arrays
。 Set会更合适,因为根据定义,它没有重复的条目。
您需要做的是在equals()
课程中实施hashCode()
和Customer
方法,以便他们仅使用id
(或id
和{ {1}}字段)但不是name
。
如果由于某种原因你需要使用数组,你有两个选择:
这将是:
balance
不同之处在于运行时,设置解决方案平均为O(1)(除非您错误地实现了public void updateOrAdd(Customer cst) {
boolean exists = false;
for(Customer existing : array) {
// !!! You need to implement your own equals method in the
// customer so it doesn't take into account the balance !!!
if(existing.equals(cst)) {
exists = true;
existing.updateBalance(cst.getBalance());
break;
}
}
if(!exists) {
// add the cst to the array
}
}
方法)。
答案 1 :(得分:0)
假设您有一个Customer
数组:
Customer[] customers = new Customer[size];
... // fill the array with data
然后,您将获得一个名为newCustomer
的新客户对象。您需要在数组中搜索newCustomer
,如果已经存在则更新它,如果不存在,则添加它。所以你可以这样做:
// Return, if it exists, a customer with id equal to newCustomer.getId()
Optional<Customer> existingCustomer =
Arrays.stream(customers)
.filter(c -> newCustomer.getId().equals(c.getId()))
.findFirst();
if (existingCustomer.isPresent()) {
// update the customer object with newCustomer information as appropriate
Customer customer = existingCustomer.get();
// assuming you have an updateBalance() method
customer.updateBalance(newCustomer.amountSpent());
} else {
// if the customer is not in the array already, add them to the current position
customers[currentIndex] = newCustomer;
}