【问题标题】:Java ArrayList add class object to list if object name is not already in the list?如果对象名称不在列表中,Java ArrayList 将类对象添加到列表中?
【发布时间】:2021-03-28 11:08:37
【问题描述】:

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

我无法弄清楚如何创建一个循环,将类对象添加到 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);
    }
}

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

【问题讨论】:

    标签: java class arraylist java.util.scanner contains


    【解决方案1】:

    替换

    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 变量的状态在整个循环中没有改变,则将立方体添加到列表中。

    【讨论】:

      【解决方案2】:

      根据您问题中的代码:

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

      java.utilArrayList 类中的方法 contains 是可行的方法,但您需要注意方法 contains [最终] 调用其元素类型的方法 equals。在您的情况下,元素类型是Cube。因此,您需要向类Cube 添加一个equals 方法。我不知道是什么决定了两个Cube 对象是否相等,但是根据您的问题,我猜如果它们具有相同的name,即使它们具有不同的lengths,它们也是相等的。我将进一步假设name 不能为空。基于这些假设,这里有一个equals 方法。您应该将此方法添加到类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;
      }
      

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

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

      【讨论】:

        【解决方案3】:

        您可以使用 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); 
        

        【讨论】:

          猜你喜欢
          • 2019-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          相关资源
          最近更新 更多