【问题标题】:Java - Checking for duplicates in arrayList and stop user from adding an order to the arrayJava - 检查 arrayList 中的重复项并阻止用户向数组添加订单
【发布时间】:2021-01-23 20:40:31
【问题描述】:

当用户尝试添加重复订单时,在顶部显示带有“未添加订单 - 重复”标签的 GUI 程序。

为了使 orderList 中的顺序被视为重复,文本字段中的所有输入(单击按钮时)必须相同。

我想我必须使用 for 循环来检查订单是否已经在 arrayList 中,但我不确定如何,我对 java 很陌生。

【问题讨论】:

标签: java user-interface arraylist duplicates


【解决方案1】:

您应该使用 Set 而不是数组,这是一个专门用于防止重复的集合:

Set 是一个不能包含重复元素的集合。它对数学集合抽象进行建模。 Set 接口仅包含从 Collection 继承的方法,并添加了禁止重复元素的限制。 Set 还为 equals 和 hashCode 操作的行为添加了更强的契约,即使 Set 实例的实现类型不同,也可以进行有意义的比较。如果两个 Set 实例包含相同的元素,则它们是相等的。

由于您是 Java 语言的新手,请退后一步,首先了解标准库提供的基本集合:List、Set 和 Map。一旦您了解了这种抽象及其实现变体,您将能够解决许多常见的日常问题。

【讨论】:

    【解决方案2】:

    虽然Set 在现实世界中会很好,但这似乎是一个具有任意限制的家庭作业,所以让我们看看如何使用ArrayList 来完成。

    我建议做的第一件事是在 Order 对象上覆盖 .equals() 方法以正确比较字段值。比如……

    @Override
    public boolean equals(Object obj) {
      //Same reference so same object in every sense of the word
      if(obj == this)
        return true;
      //Not instanced nor the same class so clearly not equal
      if(obj == null || obj.getClass() != getClass())
        return false;
    
      //Cast it to the same object type
      Order o = (Order) obj;
      //Start comparing every variable, will return false if any of them don't match
      //Be sure to use the equals operation for any variable objects such as String
      return this.name.equals(o.name) && this.value == o.value && this.someVar == o.someVar; //ect...
    }
    

    然后你只需要把你的字段变成一个像正常的对象......

    Order order = new Order(field1.getText(), field2.getText(), field3.getText()); //ect...
    

    并在与现有值的比较中运行它。我建议为此创建一个单独的方法...

    public static boolean orderExists(Order order) {
      for(Order otherOrder : orderArrayList) {
        if(order.equals(otherOrder))
          return true;
      }
      return false;
    }
    

    从那里,orderExists() 方法将告诉您它是否已经存在,您可以实现代码来显示错误。希望这可以帮助您进行足够的设置以自行处理其余的事情!

    【讨论】:

    • 如果我使用 for 循环来检查文本字段中的输入是否重复,例如我得到类似的东西,会怎么样。 For (int i=0 ; i
    • @IndiraFragaAlfonso 我建议将这些分配移到循环之外,因为不需要一遍又一遍地从文本字段中获取值。您还需要一个布尔标志,例如循环外的boolean matched = false;。在循环内部执行if(orderList[i].name.equals(name) && orderList[i].qty == qty){ matched = true; break; } 之类的操作,以便在找到匹配项后立即跳出循环。如果未找到匹配项,则 matched 将保持为 false。
    • @IndiraFragaAlfonso 另外,不要在循环标题中使用i <= orderList.length;。这将导致异常,因为长度比最大索引位置大 1。请改用i < orderList.length;。
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2014-11-03
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2019-03-16
    • 2020-03-19
    相关资源
    最近更新 更多