本文介紹了為什么ArrayList CONTAINS()方法不能處理對象?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在學習Java,遇到了一個問題。為什么ArrayList CONTAINS()方法不能處理對象?它似乎可以處理字符串和其他基本數據類型,但不能處理對象。我是否使用了錯誤的方法?
程序在第8-11行創建數據,并從命令行接收數據。來自命令行的數據為:
avacado 10 .50 broccoli 20 .75 cauliflower 30 1.00 banana 300 .55
命令行上的最后一個條目”banana 3000.55″與第11行上的數據相匹配,應該跳過,因為它已經存在,但CONTAINS()表示它不在那里。怎么會這樣?幫助。
以下是我的代碼:
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)
推薦答案
它不適用于您的類,因為它沒有有效的public boolean equals(...)
方法重寫。給它一個,一個使用關鍵字字段來測試功能相等性并包含將工作的字段。
根據contains method section of the ArrayList API:
如果此列表包含指定元素,則返回TRUE。更正式地說,當且僅當此列表包含至少一個元素e且(o==NULL?)時,才返回TRUE。E==空:o.equals(E))。
僅將名稱字段用于相等測試,并使其成為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;
}
可以工作
這篇關于為什么ArrayList CONTAINS()方法不能處理對象?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,