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

标签 java arrays object

我有一个对象数组。每个对象都是一个客户记录,即客户 ID (int)、名字 (String)、姓氏 (String) 和余额 (double)。

我的问题是我不应该有重复的客户记录,所以如果它们在文件中出现两次,我必须更新他们的余额。我不知道如何搜索数组来确定是否需要更新余额或在数组中创建新记录。

我觉得我应该在 get/setter 中执行此操作,但我不太确定。

编辑:澄清“如果他们在文件中出现两次,我必须更新他们的余额。”我有一个在记事本中制作的文件,它应该是一个客户列表,其中包含他们的所有信息。如果同一个客户出现两次,比如第二天购买更多东西,我不应该为他们创建一个新对象,因为他们已经在数组中拥有一个对象和一个位置。相反,我应该获取他们花费的金额,并将其添加到现有对象中已有的余额中。

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();
    }

}   

最佳答案

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

您需要做的是在 Customer 类中实现 equals()hashCode() 方法,以便它们仅使用 id(或 idname 字段),而不使用 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() 方法)。

关于java - 如何在java中搜索对象数组然后更新对象的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381755/

相关文章:

java - 如何纠正这个简单的Java代码? [如何打印表观类型 = Object 且实际类型 = int (array) 的变量的所有元素?]

java - 位数组 Java 的高效连接

php - PHP 关联数组是否有相当于 Python 字典 setdefault 的功能?

c# - 如何从 WPF 画笔中获取数组?

c - 返回指向数组的指针的函数

javascript - 将新对象作为参数传递给仅更改 1 个值的函数

JavaScript - 递归构建树形数据结构

将实现的类分配给接口(interface)时出现Java Reflection NoSuchMethod异常

java - 将 JSON 字符串转换为 Java 对象或 HashMap

java - 使用spring MVC返回生成的pdf