要唯一的对象列表

时间:2016-09-30 22:49:36

标签: java

我有一个名为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;
    }

}

1 个答案:

答案 0 :(得分:6)

您需要在Stock中添加HashSet<Stock>个对象。

在向集合添加Stock对象之前,您可以通过调用HashSet来检查myStockHashSet.contains( stock )是否已包含该对象。 (但即使您继续向stock添加重复的HashSet对象,新对象也不会替换旧对象,因此永远不会有重复项。)

为了使HashSet起作用,它必须能够判断两个Stock对象是否相同。为此,您的Stock课程需要实施hashCode()equals()

  • hashCode()需要将字段stockIdcodename混合在一起。最新版本的java提供了Objects.hashCode( Object ... )便捷方法,可以快速散列您的字段。如果您不是针对最新版本的java编程,则需要编写自己的hashCode()计算实现。在这里寻找一些好的建议:Best implementation for hashCode method

  • 只有当两个对象中的所有这些字段相同时,
  • equals()才会返回true

注意:

  • 使用List 浪费您的时间,因为列表允许重复。

  • 执行而不是浪费您的时间来实施Comparable,因为这是用于订购对象,不是用于比较对象为了平等, HashSet并不关心您的对象是否实现Comparable