2016-02-04 62 views
0

我正在学习Java并遇到问题。为什么ArrayList不包含()方法与对象一起工作?它似乎与字符串和其他基本数据类型一起工作,但不是对象。我使用错误的方法吗?为什么ArrayList不包含()方法与对象一起工作?

该程序在第8 - 11行创建数据并从命令行接收它。在命令行中的数据是:

avacado 10 .50 broccoli 20 .75 cauliflower 30 1.00 banana 300 .55 

中的最后一项“香蕉300 0.55”在命令行上的数据相匹配的线11,并应被忽略为已经存在的,但包含()说,这是不存在的。怎么来的?帮帮我。

这里是我的代码:

package java21days; 

import java.util.*; 

public class FruitBasket3 { 

    ArrayList<Fruit> cart; 
    Fruit apple = new Fruit("apple", 100, .75F); 
    Fruit orange = new Fruit("orange", 200, .90F); 
    Fruit banana = new Fruit("banana", 300, .55F); 
    Fruit kumkwat = new Fruit(); 

    public FruitBasket3(String[] userCodes) { 
     cart = new ArrayList<>(); 
     int quantity; 
     float price; 

     addCode(apple); 
     addCode(orange); 
     addCode(banana); 
     addCode(kumkwat); 

     for (int j = 0; j < userCodes.length; j+=3) { 
      quantity = Integer.parseInt(userCodes[j+1]); 
      price = Float.parseFloat(userCodes[j+2]); 
      addCode(new Fruit(userCodes[j],quantity,price)); 
     } 

     // display all codes 
     for (Fruit code : cart) { 
      System.out.println("Fruit: " + code.getName() + " Price: " + 
        code.getQuantity() * code.getPrice()); 
     } 
    } 

    private void addCode(Fruit inFruit) { 
     boolean match = false; 
     System.out.println("Inside addCode with fruit: " + inFruit.getName() + 
       " Quantity: " + inFruit.getQuantity() + " Price: " + inFruit.getPrice()); 
     if (!cart.contains(inFruit)) { 
      System.out.println(" Passed the contains test."); 
      for (Fruit item : cart) { 
       System.out.println(" Existing: " + item.getName() + 
         " Quantity: " + item.getQuantity() + " Price: " + item.getPrice()); 
       System.out.println(" New:  " + inFruit.getName() + 
         " Quantity: " + inFruit.getQuantity() + " Price: " + inFruit.getPrice()); 

       //if (inFruit.getName() == item.getName() && 
       //  inFruit.getQuantity() == item.getQuantity() && 
       //  inFruit.getPrice() == item.getPrice()){ 
       if (inFruit.getName().equals(item.getName()) && 
         inFruit.getQuantity() == item.getQuantity() && 
         inFruit.getPrice() == item.getPrice()){ 
        match = true; 
        System.out.println("  Did not pass the individual element comparision test."); 
       } else { 
        System.out.println("  Passed the individual element comparision test."); 
       } 
      } 
      if (!match) { 
       System.out.println("   >>>> adding."); 
       cart.add(inFruit); 
      } else { 
       System.out.println("   >>>> did not add."); 
      } 
     } else { 
      System.out.println(" Fruit: " + inFruit.getName() + " already on file ... bypassing."); 
     } 
    } 

    public static void main(String[] arguments) { 
     if (arguments.length % 3 != 0) { 
      System.out.println("Error!!! Incorrect number of arguments."); 
     } else { 
      FruitBasket3 keeper = new FruitBasket3(arguments); 
     } 
    } 

} 

public class Fruit { 
    private String name; 
    private int quantity; 
    private float price; 

    public Fruit() { 
     name = ""; 
     quantity = 0; 
     price = 0.0F; 
    } 

    public Fruit(String inName, int inQuantity, float inPrice) { 
     name = inName; 
     quantity = inQuantity; 
     price = inPrice; 
    } 

    public String getName(){ 
     return name; 
    } 

    public int getQuantity(){ 
     return quantity; 
    } 

    public float getPrice(){ 
     return price; 
    } 
} 

输出是:

run: 
Inside addCode with fruit: apple Quantity: 100 Price: 0.75 
    Passed the contains test. 
      >>>> adding. 
Inside addCode with fruit: orange Quantity: 200 Price: 0.9 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  orange Quantity: 200 Price: 0.9 
     Passed the individual element comparision test. 
      >>>> adding. 
Inside addCode with fruit: banana Quantity: 300 Price: 0.55 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
    Existing: orange Quantity: 200 Price: 0.9 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
      >>>> adding. 
Inside addCode with fruit: Quantity: 0 Price: 0.0 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  Quantity: 0 Price: 0.0 
     Passed the individual element comparision test. 
    Existing: orange Quantity: 200 Price: 0.9 
    New:  Quantity: 0 Price: 0.0 
     Passed the individual element comparision test. 
    Existing: banana Quantity: 300 Price: 0.55 
    New:  Quantity: 0 Price: 0.0 
     Passed the individual element comparision test. 
      >>>> adding. 
Inside addCode with fruit: avacado Quantity: 10 Price: 0.5 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  avacado Quantity: 10 Price: 0.5 
     Passed the individual element comparision test. 
    Existing: orange Quantity: 200 Price: 0.9 
    New:  avacado Quantity: 10 Price: 0.5 
     Passed the individual element comparision test. 
    Existing: banana Quantity: 300 Price: 0.55 
    New:  avacado Quantity: 10 Price: 0.5 
     Passed the individual element comparision test. 
    Existing: Quantity: 0 Price: 0.0 
    New:  avacado Quantity: 10 Price: 0.5 
     Passed the individual element comparision test. 
      >>>> adding. 
Inside addCode with fruit: broccoli Quantity: 20 Price: 0.75 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  broccoli Quantity: 20 Price: 0.75 
     Passed the individual element comparision test. 
    Existing: orange Quantity: 200 Price: 0.9 
    New:  broccoli Quantity: 20 Price: 0.75 
     Passed the individual element comparision test. 
    Existing: banana Quantity: 300 Price: 0.55 
    New:  broccoli Quantity: 20 Price: 0.75 
     Passed the individual element comparision test. 
    Existing: Quantity: 0 Price: 0.0 
    New:  broccoli Quantity: 20 Price: 0.75 
     Passed the individual element comparision test. 
    Existing: avacado Quantity: 10 Price: 0.5 
    New:  broccoli Quantity: 20 Price: 0.75 
     Passed the individual element comparision test. 
      >>>> adding. 
Inside addCode with fruit: cauliflower Quantity: 30 Price: 1.0 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  cauliflower Quantity: 30 Price: 1.0 
     Passed the individual element comparision test. 
    Existing: orange Quantity: 200 Price: 0.9 
    New:  cauliflower Quantity: 30 Price: 1.0 
     Passed the individual element comparision test. 
    Existing: banana Quantity: 300 Price: 0.55 
    New:  cauliflower Quantity: 30 Price: 1.0 
     Passed the individual element comparision test. 
    Existing: Quantity: 0 Price: 0.0 
    New:  cauliflower Quantity: 30 Price: 1.0 
     Passed the individual element comparision test. 
    Existing: avacado Quantity: 10 Price: 0.5 
    New:  cauliflower Quantity: 30 Price: 1.0 
     Passed the individual element comparision test. 
    Existing: broccoli Quantity: 20 Price: 0.75 
    New:  cauliflower Quantity: 30 Price: 1.0 
     Passed the individual element comparision test. 
      >>>> adding. 
Inside addCode with fruit: banana Quantity: 300 Price: 0.55 
    Passed the contains test. 
    Existing: apple Quantity: 100 Price: 0.75 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
    Existing: orange Quantity: 200 Price: 0.9 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
    Existing: banana Quantity: 300 Price: 0.55 
    New:  banana Quantity: 300 Price: 0.55 
     Did not pass the individual element comparision test. 
    Existing: Quantity: 0 Price: 0.0 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
    Existing: avacado Quantity: 10 Price: 0.5 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
    Existing: broccoli Quantity: 20 Price: 0.75 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
    Existing: cauliflower Quantity: 30 Price: 1.0 
    New:  banana Quantity: 300 Price: 0.55 
     Passed the individual element comparision test. 
      >>>> did not add.*** 
Fruit: apple Price: 75.0 
Fruit: orange Price: 180.0 
Fruit: banana Price: 165.0 
Fruit: Price: 0.0 
Fruit: avacado Price: 5.0 
Fruit: broccoli Price: 15.0 
Fruit: cauliflower Price: 30.0 
BUILD SUCCESSFUL (total time: 0 seconds) 

回答

4

它不类的工作,因为它没有一个有效的方法public boolean equals(...)覆盖。给它一个,一个使用关键字段来测试功能是否相等,并且包含工作。

contains method section of the ArrayList API:如果此列表包含指定的元素

返回true。更正式地说,当且仅当该列表包含至少一个元素e(例如(o == null?e == null:o.equals(e))时才返回true。

使用名称字段只为平等的测试,并使其成为final场,因为你不希望使用可能会改变字段。还要给它一个hashCode覆盖,它也使用equals方法中测试的相同字段。

喜欢的东西:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Fruit other = (Fruit) obj; 
    if (name == null) { 
     if (other.name != null) 
      return false; 
    } else if (!name.equals(other.name)) 
     return false; 
    return true; 
} 

可以工作

0

的方法包括()在ArrayList类使用方法equals()方法来评价两个对象。如果两个对象是SAME对象,则ArrayList equals()将起作用。您必须重写类中的equals()方法,并定义评估标准以定义果实是否已包含在您的列表中。 将此代码添加到您的Fruit类

@Override 
public boolean equals(Object o1) { 
if (this == obj) { 
    return true; 
} 
Fruit fruit = (Fruit)o1 
if (name != null && fruit.getName() != null) { 
    if (name.equas(fruit.getName())) { 
     return true; 
    } 
    return false; 
} 
return false; 
相关问题