Как найти массив объектов, а затем обновить часть объекта в Java?

1

У меня есть массив объектов. Каждый объект - это запись клиента, которая является идентификатором клиента (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();
    }

}   
  • 0
    Вы можете использовать другую структуру данных? Не могли бы вы уточнить, «если они появляются в файле дважды, я должен просто обновить их баланс». слишком?
Теги:
object
arrays

2 ответа

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;
}
0

В этом случае вы не должны использовать 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()).

  • 0
    кажется, что операция не может использовать какие-либо структуры данных, кроме массива
  • 0
    @ KickButtowski, следовательно, вторая часть моего ответа :-)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню