Java ArrayList 添加 class 对象到列表中(如果对象名称不在列表中)?

Java ArrayList add class object to list if object name is not already in the list?

我已经查看了其他问题,但似乎无法找到我正在寻找的答案。

我无法弄清楚如何创建一个循环,将 class 对象添加到 ArrayList 中,前提是它的名称尚未在列表中使用。

这是我的 class。

package myPackage;

public class Cube {
    private int length;
    private String name;

    public Cube(int initLength, String initName) {
        this.length = initLength;
        this.name = initName;
    }

我想创建新的多维数据集并将它们添加到列表中。这是我尝试使用的代码。

在 while 循环中我不知道如何确定该名称是否已被使用

package myPackage;

import java.util.ArrayList;
import java.util.Scanner;

public class PartFive {

    public static void main(String[] args) {
        ArrayList<Cube> cubelist = new ArrayList<>();
        Cube oshea = new Cube (13, "oshea");
        Cube mike = new Cube (7, "tony");
        cubelist.add(oshea);
        cubelist.add(mike);

        Scanner reader = new Scanner(System.in);
        while (true) {
            System.out.println("enter cube name (blank quits): ");
            String name = reader.nextLine();
            if (name.equals("")){
                break;
            }
            System.out.println("enter side length: ");
            int length = Integer.valueOf(reader.nextLine());

            Cube newcube = new Cube(length, name);
            if(cubelist.contains(newcube.name)) {
                // dont add to list
            }
            else {
                cubelist.add(newcube);
            }
        }
        reader.close();
        System.out.println(cubelist);
    }
}

欢迎提出建设性的批评和建议。

替换

if(cubelist.contains(newcube.name)) {
  dont add to list
}
else {
  cubelist.add(newcube);
}

boolean found = false;
for(Cube cube: cubelist){
    if(cube.getName().equals(name)) {
        found = true;
        break;
    }
}

if(!found) {
    cubelist.add(newcube);
}

想法是使用 boolean 变量来跟踪列表中是否已存在与输入 name 同名的多维数据集。为此,迭代 cubelist,如果找到与输入 name 同名的多维数据集,则更改 boolean 变量的状态和 break 循环。如果 boolean 变量的状态在整个循环中没有改变,则将立方体添加到列表中。

来自您问题中的代码:

if(cubelist.contains(newcube.name)) {
    // don't add to list
}
else {
    cubelist.add(newcube);
}

其元素类型的方法contains in class java.utilArrayList is the way to go but you need to be aware that method contains [eventually] calls method equals。在您的例子中,元素类型是 Cube。因此,您需要在 class Cube 中添加一个 equals 方法。我不知道是什么决定了两个 Cube 对象是否相等,但我猜,根据你的问题,如果它们具有相同的 name,即使它们具有不同的 length秒。我将进一步假设 name 不能为空。基于这些假设,这里有一个 equals 方法。您应该将此方法添加到 class Cube.

public boolean equals(Object obj) {
    boolean areEqual = false;
    if (this == obj) {
        areEqual = true;
    }
    else {
        if (obj instanceof Cube) {
            Cube other = (Cube) obj;
            areEqual = name.equals(other.name);
        }
    }
    return areEqual;
}

现在,在 class PartFive 的方法 main 中,您可以使用以下 ifCube 添加到列表中。

if (!cubelist.contains(newcube)) {
    cubelist.add(newcube);
}

您可以使用 lambda 表达式检查 cubelist 数组中的重复名称(为了更好的可读性):

 boolean isNameAlreadyExisting = cubelist.stream()
                .anyMatch(cube -> cube.getName().equals(newcube.getName())); // this is returning true if any of the cubelist element's name is equal with the newcube's name, meaning that the name is already existing in the cubelist 

 if (!isNameAlreadyExisting) {
   cubelist.add(newcube);
 }

您应该做的一件事是删除导致无限循环的 while(true) 指令。 另一个建议是显示 cubelist 包含的对象的名称,看看确实名称没有重复:

cubelist.stream()
        .map(Cube::getName)
        .forEach(System.out::println);