我正在进行一项任务,我必须在礼物的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;
}
}
答案 0 :(得分:3)
提示:
equals()
和hashCode()
上查看Present
。List.remove(int index)
和List.contains(Object)
。答案 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.equals和List.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,现在有了 两个选项:
在添加之前总是调用remove(对于新对象),因此它总是删除最旧的条目
或在添加之前检查是否存在。
虽然第二个选项可能更有效,但它取决于你想如何利用你的队列(如何为重复的对象定义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
}
}