如何搜索对象数组,然后在java中更新对象的一部分?

时间:2015-04-01 02:15:01

标签: java arrays object

我有一个对象数组。每个对象都是客户记录,即客户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();
    }

}   

2 个答案:

答案 0 :(得分:0)

在这种情况下,您不应该使用arraysSet会更合适,因为根据定义,它没有重复的条目。

您需要做的是在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;
}