我有一个名为Stock的简单类,下面列出了代码,我的要求是创建一个Stock集合,其中字段StockId,Code和name的组合应该是唯一的,我这样做是通过实现我自己的列表类。我想知道是否有更好的方法来做到这一点
public class Stock {
private Integer stockId;
private String stockCode;
private String stockName;
public Stock() {
}
public Stock(Integer stockId,String stockCode, String stockName) {
this.stockCode = stockCode;
this.stockName = stockName;
}
public Integer getStockId() {
return this.stockId;
}
public void setStockId(Integer stockId) {
this.stockId = stockId;
}
public String getStockCode() {
return this.stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
public String getStockName() {
return this.stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
}
列出班级
public class StockList {
private List<Stock> listStock;
public StockList(){
listStock = new ArrayList<Stock>();
}
public void add(Stock stock){
boolean result=true;
for(Stock st:listStock){
int count=0;
if(st.getStockId()==stock.getStockId()){
count++;
}
if(st.getStockCode()==stock.getStockCode()){
count++;
}
if(st.getStockName()==stock.getStockName()){
count++;
}
if(count>=3){
result=false;
break;
}
}
if(result) {
listStock.add(stock);
}
}
public List<Stock> getList(){
return listStock;
}
}
我甚至按照说明尝试了Hashset,但它仍然允许我在每个字段中添加两个具有相同值的Stock对象
import java.util.HashSet;
import java.util.Set;
public class Stock {
private Integer stockId;
private String stockCode;
private String stockName;
public Stock() {
}
public Stock(Integer stockId,String stockCode, String stockName) {
this.stockCode = stockCode;
this.stockName = stockName;
}
public Integer getStockId() {
return this.stockId;
}
public void setStockId(Integer stockId) {
this.stockId = stockId;
}
public String getStockCode() {
return this.stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
public String getStockName() {
return this.stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + stockId+stockCode.hashCode()+stockName.hashCode();
return result;
}
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Stock other = (Stock) obj;
int count=0;
if (stockId == other.stockId){
count++;
}
if(stockCode.equalsIgnoreCase(other.stockCode)){
count++;
}
if(stockName.equalsIgnoreCase(other.stockName)){
count++;
}
if(count<3) {
return true;
}
return false;
}
}
答案 0 :(得分:6)
您需要在Stock
中添加HashSet<Stock>
个对象。
在向集合添加Stock
对象之前,您可以通过调用HashSet
来检查myStockHashSet.contains( stock )
是否已包含该对象。 (但即使您继续向stock
添加重复的HashSet
对象,新对象也不会替换旧对象,因此永远不会有重复项。)
为了使HashSet
起作用,它必须能够判断两个Stock
对象是否相同。为此,您的Stock
课程需要实施hashCode()
和equals()
。
hashCode()
需要将字段stockId
,code
和name
混合在一起。最新版本的java提供了Objects.hashCode( Object ... )
便捷方法,可以快速散列您的字段。如果您不是针对最新版本的java编程,则需要编写自己的hashCode()
计算实现。在这里寻找一些好的建议:Best implementation for hashCode method
equals()
才会返回true
。
注意:
使用List
来 浪费您的时间,因为列表允许重复。
执行而不是浪费您的时间来实施Comparable
,因为这是用于订购对象,不是用于比较对象为了平等,和 HashSet
并不关心您的对象是否实现Comparable
。