【问题标题】:List of Objects to be Unique [duplicate]要唯一的对象列表[重复]
【发布时间】:2017-02-09 14:24:28
【问题描述】:

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

}

【问题讨论】:

标签: java


【解决方案1】:

您需要在HashSet&lt;Stock&gt; 中添加您的Stock 对象。

在将Stock 对象添加到集合之前,您将能够通过调用myStockHashSet.contains( stock ) 检查HashSet 是否已经包含它。 (但即使您继续向HashSet 添加重复的stock 对象,新对象不会替换旧对象,因此永远不会出现重复。)

为了让HashSet 工作,它必须能够判断两个Stock 对象是否相同。为此,您的Stock 类将需要实现hashCode()equals()

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

  • equals() 应该返回 true 只有当所有这些字段在两个对象中都相等时。

注意:

  • 不要不要List 上浪费你的时间,因为列表允许重复。

  • 不要浪费你的时间来实现Comparable,因为这是排序对象,not比较对象是否相等, and HashSet 不关心你的对象是否实现了Comparable

【讨论】:

  • 在添加之前不要打电话给contains(),因为add()本身会告诉你它是否是新的。
  • @shmosel 是的,你是对的。我在答案中添加了一个注释。
  • @Andreas 新对象不会替换现有对象,所以没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多