ArrayList - 删除第一个添加的对象,不重复

时间:2014-12-21 22:29:01

标签: java arraylist

我正在进行一项任务,我必须在礼物的ArrayList中添加一个Present。 ArrayList中最多可以有10个呈现,并且当前由其类型,成本和名称定义,如果这三个字段相同,则它们是相同的,并且不能添加到ArrayList。

当添加第11个礼物时,必须删除添加到列表中的第一个礼物,并且这个新礼物取而代之。

我真的被卡住了。

到目前为止,这是我的代码:

public class GiftList 

{

       private ArrayList<Present> presents;

       public GiftList() {
              presents = new ArrayList<Present>();
       }

       public void addPresent(Present present) {
       if (presents.size() <= 10) {
              presents.add(present);
       }
       else {
              //**Remove oldest present in list, then
              presents.add(present);
       }
       //**Another if statement for no duplicated presents
}

public class Present
{
    private String name;
    private String type;
    private double cost;

    public Present(String name, String type, double cost) {
        this.name = name;
        this.type = type;
        this.cost = cost;
    }
}

5 个答案:

答案 0 :(得分:3)

提示:

答案 1 :(得分:1)

如果您向equals对象添加Present方法:

public class Present {
    private double cost;
    private String name;
    private String type;

    public Present(String name, String type, double cost) {
        this.name = name;
        this.type = type;
        this.cost = cost;
    }

    public boolean equals(Object o) {
        if (o instanceof Present) {
            Present p2 = (Present) o;
            return name.equals(p2.name) && type.equals(p2.type) && Double.valueOf(cost).equals(p2.cost);
        }
        return false;
    }

    public int hashCode() {
        return Objects.hash(name, type, cost);
    }
}

然后可以使用以下代码:

List<Present> myList = new ArrayList<Present>() {
    @Override
    public boolean add(final Present present) {
        if (contains(present)) {
            return false;
        }
        if (size() >= 10) {
            remove(0);
        }
        return super.add(present);
    }
};

myList.add(new Present("name", "type", 1.0));

有关详细信息,请参阅Object.equalsList.remove

但是,我认为最好的方法是使用Set自动处理 no repeats -problem或某种Queue。如果使用某种哈希解决方案(例如HashSet),请不要忘记实现hashCode函数(有关hashCode here的更多信息)。

编辑:在@TJamesBoone输入后添加hashCode - 实现。

答案 2 :(得分:0)

你可以通过调用

删除第一个元素
presents.remove(0);

检查一下 http://www.tutorialspoint.com/java/util/arraylist_remove.htm

对于重复,如果您使用Set

会更好

但是,如果你坚持使用ArrayList,那么就像已经提到的那样实现equals / hashcode,现在有了 两个选项:

  1. 在添加之前总是调用remove(对于新对象),因此它总是删除最旧的条目

  2. 或在添加之前检查是否存在。

  3. 虽然第二个选项可能更有效,但它取决于你想如何利用你的队列(如何为重复的对象定义FIFO?)。如果列表中已存在新对象,是否要更新其索引,因为它是新条目?如果是,则更新其状态,并且将在以后删除,而不是保留旧版本。

答案 3 :(得分:0)

看看你的描述,我认为这可以完成你的工作

int rotatingIndex =- 1 ; //variable maintaining current value of the index.-1 when no elements are         present
public void addPresent(Present present) {
    rotatingIndex = (rotatingIndex + 1)%10;
    presents.add(rotatingIndex,present);
}

答案 4 :(得分:0)

我建议覆盖Present的equals,并使用linkedlist作为队列。等;

public class Present
{
    private String name;
    private String type;
    private Double cost;


    public Present(String name, String type, Double cost) {
        this.name = name;
        this.type = type;
        this.cost = cost;
    }



    public String getName() {
        return name;
    }



    public void setName(String name) {
        this.name = name;
    }



    public String getType() {
        return type;
    }



    public void setType(String type) {
        this.type = type;
    }



    public Double getCost() {
        return cost;
    }



    public void setCost(Double cost) {
        this.cost = cost;
    }



    @Override
    public boolean equals(Object obj){
        if(obj == null || !(obj instanceof Present)){
        return false;
        }

        Present anotherPresent = (Present) obj;
        if(this.getName() == anotherPresent.getName() 
                && this.getCost() == anotherPresent.getCost() 
                && this.getType() == anotherPresent.getType()){
            return true;
        }
        return false;
    }

}

礼品课:

public class GiftList 

{

       private LinkedList<Present> presents = new LinkedList() ;

       public void addPresent(Present present) {
       if (presents.contains(present)){
           // do nothing it already exists!!
           return ;
       }
       if(presents.size() <= 10) {
              presents.add(present);
       }
       else {
            presents.pop();
              //**Remove oldest present in list, then
              presents.add(present);
       }
       //**Another if statement for no duplicated presents
}
}