如果对象名称不在列表中,Java ArrayList是否将类对象添加到列表中?

如果对象名称不在列表中,Java ArrayList是否将类对象添加到列表中?,java,class,arraylist,java.util.scanner,contains,Java,Class,Arraylist,Java.util.scanner,Contains,我看了其他问题,但似乎找不到我想要的答案 我很难弄清楚如何创建一个循环,仅当类对象的名称未在列表中使用时才将其添加到ArrayList 这是我上的课 package myPackage; public class Cube { private int length; private String name; public Cube(int initLength, String initName) { this.length = initLength;

我看了其他问题,但似乎找不到我想要的答案

我很难弄清楚如何创建一个循环,仅当类对象的名称未在列表中使用时才将其添加到ArrayList

这是我上的课

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);
}

其思想是使用布尔变量来跟踪列表中是否存在与输入名称同名的多维数据集。为此,迭代cubelist,如果找到与输入名称同名的多维数据集,则更改布尔变量的状态并中断循环。如果布尔变量的状态在整个循环中没有改变,请将多维数据集添加到列表中。

Replace

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


其思想是使用布尔变量来跟踪列表中是否存在与输入名称同名的多维数据集。为此,迭代cubelist,如果找到与输入名称同名的多维数据集,则更改布尔变量的状态并中断循环。如果布尔变量的状态在整个循环中没有改变,请将多维数据集添加到列表中。

来自您问题中的代码:

ifcubelist.containsnewcube.name{ //不要添加到列表中 } 否则{ cubelist.addnewcube; } 类java.utilArrayList中的方法是可行的,但您需要注意,该方法包含[最终]调用其元素类型的方法。在您的例子中,元素类型是Cube。因此,您需要向类多维数据集添加一个equals方法。我不知道是什么决定了两个立方体对象是否相等,但我想,根据你的问题,如果它们有相同的名称,即使它们有不同的长度,它们也是相等的。我将进一步假设name不能为null。基于这些假设,这里有一个equals方法。您应该将此方法添加到类多维数据集中

公共布尔等式对象obj{ 布尔值等于假; 如果这个==obj{ areEqual=真; } 否则{ 如果多维数据集的obj实例{ 立方体其他=立方体对象; areEqual=name.equalsother.name; } } 回报是平等的; } 现在,在第五部分类的main方法中,如果要向列表中添加多维数据集,可以使用以下命令

如果立方管{ cubelist.addnewcube; }
根据您问题中的代码:

ifcubelist.containsnewcube.name{ //不要添加到列表中 } 否则{ cubelist.addnewcube; } 类java.utilArrayList中的方法是可行的,但您需要注意,该方法包含[最终]调用其元素类型的方法。在您的例子中,元素类型是Cube。因此,您需要向类多维数据集添加一个equals方法。我不知道是什么决定了两个立方体对象是否相等,但我想,根据你的问题,如果它们有相同的名称,即使它们有不同的长度,它们也是相等的。我将进一步假设name不能为null。基于这些假设,这里有一个equals方法。您应该将此方法添加到类多维数据集中

公共布尔等式对象obj{ 布尔值等于假; 如果这个==obj{ areEqual=真; } 否则{ 如果多维数据集的obj实例{ 立方体其他=立方体对象; areEqual=name.equalsother.name; } } 回报是平等的; } 现在,在第五部分类的main方法中,如果要向列表中添加多维数据集,可以使用以下命令

如果立方管{ cubelist.addnewcube; }
可以使用lambda表达式检查立方体列表数组中的重复名称,以提高可读性:

 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);
 }
您应该做的一件事是删除whiletrue指令,它会导致无限循环。 另一个建议是显示cubelist包含的对象的名称,以确保名称不重复:

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

可以使用lambda表达式检查立方体列表数组中的重复名称,以提高可读性:

 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);
 }
您应该做的一件事是删除whiletrue指令,它会导致无限循环。 另一个建议是显示cubelist包含的对象的名称,以确保名称不重复:

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