У меня есть массив объектов. Каждый объект - это запись клиента, которая является идентификатором клиента (int), именем (String), фамилией (String) и балансом (double).
Моя проблема заключается в том, что у меня не должно быть дубликатов записей клиентов, поэтому, если они появляются в файле дважды, я должен просто обновить их баланс. Я не могу понять, как искать массив, чтобы узнать, нужно ли мне просто обновлять баланс или создавать новую запись в массиве.
Я чувствую, что должен делать это в get/seters, но я не совсем уверен.
edit: уточнить, " если они появляются в файле дважды, я должен просто обновить их баланс". У меня есть файл, который я сделал в блокноте, который должен быть списком клиентов, который имеет всю свою информацию. если один и тот же клиент дважды появляется, скажите на следующий день, чтобы купить больше вещей, я не должен создавать для них новый объект, поскольку у них уже есть объект и место в массиве. вместо этого я должен взять сумму, которую они потратили, и добавить ее к уже существующему балансу в пределах своего существующего объекта.
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();
}
}
Предположим, у вас есть массив 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;
}
В этом случае вы не должны использовать arrays
. Набор будет гораздо более подходящим, поскольку он по определению не имеет повторяющихся записей.
Что вам нужно сделать, так это реализовать методы equals()
и hashCode()
в вашем классе Customer
чтобы они использовали только id
(или поля id
и name
), но не balance
.
Если по какой-то причине вам нужно использовать массивы, у вас есть два варианта:
Это было бы что-то вроде:
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
}
}
Разница заключается во времени выполнения, решение набора будет постоянным O (1) в среднем (если вы неправильно реализуете свой метод hashCode()
).