Java 如何仅在arraylist中不存在同名的其他项时添加项?

Java 如何仅在arraylist中不存在同名的其他项时添加项?,java,arrays,arraylist,Java,Arrays,Arraylist,如果项目与insertUniqueItem()方法中arraylist中的其他项目没有相同的名称,我如何仅插入该项目 我可能会使用LinkedHashMap,其中键是项目的名称。这样: 你还是要保持秩序 您可以轻松有效地检查给定项目名称是否已有条目 你会有类似于: if (!map.containsKey(item.getName()) { map.put(item.getName(), item); } boolean containsItemName(ArrayList<

如果项目与insertUniqueItem()方法中arraylist中的其他项目没有相同的名称,我如何仅插入该项目


我可能会使用
LinkedHashMap
,其中键是项目的名称。这样:

  • 你还是要保持秩序
  • 您可以轻松有效地检查给定项目名称是否已有条目
你会有类似于:

if (!map.containsKey(item.getName()) {
    map.put(item.getName(), item);
}
boolean containsItemName(ArrayList<Item> items, String name) {
    for (Item item : items) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}
但这仅在您希望所有项目在名称上都是唯一的情况下才有效。如果您有时希望允许重复的名称,有时不允许,您可能确实需要一个列表,然后您可以有如下内容:

if (!map.containsKey(item.getName()) {
    map.put(item.getName(), item);
}
boolean containsItemName(ArrayList<Item> items, String name) {
    for (Item item : items) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}
boolean containsItemName(数组列表项,字符串名称){
用于(项目:项目){
if(item.getName().equals(name)){
返回true;
}
}
返回false;
}
如果您使用的是Java 8,则可以使用基于流的解决方案:

boolean containsItemName(ArrayList<Item> items, String name) {
    return items.stream().anyMatch(item -> item.getName().equals(name));
}
boolean containsItemName(数组列表项,字符串名称){
返回items.stream().anyMatch(item->item.getName().equals(name));
}

我可能会使用
LinkedHashMap
,其中键是项目的名称。这样:

  • 你还是要保持秩序
  • 您可以轻松有效地检查给定项目名称是否已有条目
你会有类似于:

if (!map.containsKey(item.getName()) {
    map.put(item.getName(), item);
}
boolean containsItemName(ArrayList<Item> items, String name) {
    for (Item item : items) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}
但这仅在您希望所有项目在名称上都是唯一的情况下才有效。如果您有时希望允许重复的名称,有时不允许,您可能确实需要一个列表,然后您可以有如下内容:

if (!map.containsKey(item.getName()) {
    map.put(item.getName(), item);
}
boolean containsItemName(ArrayList<Item> items, String name) {
    for (Item item : items) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}
boolean containsItemName(数组列表项,字符串名称){
用于(项目:项目){
if(item.getName().equals(name)){
返回true;
}
}
返回false;
}
如果您使用的是Java 8,则可以使用基于流的解决方案:

boolean containsItemName(ArrayList<Item> items, String name) {
    return items.stream().anyMatch(item -> item.getName().equals(name));
}
boolean containsItemName(数组列表项,字符串名称){
返回items.stream().anyMatch(item->item.getName().equals(name));
}

我建议您在购物车中使用集合而不是列表。Set将管理项目的唯一性。确保在Item类中使用equals方法重写

我建议您在ShoppingCart中使用集合而不是列表。Set将管理项目的唯一性。确保在Item类中使用equals方法重写,您需要检查列表中是否已存在同名的项:

public void insertUniqueItem(Item item) {
    if(!contains(item)) {
        cart.add(item);
    }
}

private boolean contains(Item item) {
    for(Item i : cart) {
        if(i.getName().equals(item.getName())) {
           return true;
        }
    }
    return false;
}

您需要检查列表中是否已存在同名项目:

public void insertUniqueItem(Item item) {
    if(!contains(item)) {
        cart.add(item);
    }
}

private boolean contains(Item item) {
    for(Item i : cart) {
        if(i.getName().equals(item.getName())) {
           return true;
        }
    }
    return false;
}

您可以修改Item类,使其具有equals和hashcode方法,如下所示:

public class Item{

    private String name;


    public boolean equals(Object o){
        if (o instanceOf Item and ((Item)o).getName().compareTo(name) == 0){
            return true;
        }
        return false;
    }

    public int hashCode(){
        return name.hashCode();
    }

}

现在,您可以使用arrayList的contains方法来确定arrayList中是否存在具有相同名称的另一项。

您可以修改item类,使其具有equals和hashcode方法,如下所示:

public class Item{

    private String name;


    public boolean equals(Object o){
        if (o instanceOf Item and ((Item)o).getName().compareTo(name) == 0){
            return true;
        }
        return false;
    }

    public int hashCode(){
        return name.hashCode();
    }

}

现在,您可以使用arrayList的contains方法来确定arrayList中是否存在另一个同名项。

如果项在名称上自然相等,则该方法有效。但是,如果有两个项具有相同的名称但其他值不同,则它们相等可能有点奇怪,我怀疑。true。这就是为什么在我认为你没有领会我的观点之前,必须重写equals方法来定义唯一性规则-如果你仅仅根据名称重写它使其相等,你可能会发现,在其他地方,你希望它基于其他属性是相等的。如果项目仅仅在名称上是自然相等的,那就行了——但是如果有两个项目具有相同的名称但其他值不同,那么它们相等就有点奇怪了,我怀疑。真的。这就是为什么必须重写equals方法来定义唯一性规则,否则我认为您没有领会我的观点-如果您仅基于名称将其重写为相等,您可能会发现在其他地方您希望它基于其他属性相等。谢谢您的回答,但我只想使用arraylist。不过我明白这是怎么回事了。再次感谢:)谢谢你的回答,但我想坚持只使用我的arraylist。不过我明白这是怎么回事了。再一次,谢谢:)非常感谢:D我喜欢这样做,我不必添加哈希或列表。它是有效的:)非常感谢:D我喜欢这样做,我不必添加哈希或列表。它是有效的:)谢谢你的回答,但我想继续只使用arraylist,而不使用哈希来完成它。只需要使用哈希,arraylist就可以确定其中是否存在该项。它没有使用哈希表谢谢你的回答,但我想继续只使用arraylist,而不是使用哈希来完成它。只需要使用哈希表,arraylist就可以确定其中是否存在该项。它不使用哈希表