简体   繁体   中英

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

I have looked through other questions but cant seem to find the answer I am looking for.

I am having trouble figuring out how to create a loop that adds a class object to an ArrayList only if it its name is not used in the list already.

This is the class I have.

package myPackage;

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

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

I would like to create new cubes and add them to a list. Here is the code I am trying to do this with.

In the while loop I can't figure out how to determine if the name has been used or not

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

Any constructive criticisms and suggestions are welcomed.

Replace

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

with

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

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

The idea is to use a boolean variable to track if a cube with the same name as that of the input name already exists in the list. For this, iterate cubelist and if a cube with the same name as that of the input name is found, change the state of the boolean variable and break the loop. If the state of the boolean variable does not change throughout the loop, add the cube to the list.

From the code in your question:

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

Method contains in class java.utilArrayList is the way to go but you need to be aware that method contains [eventually] calls method equals of its element type.In your case, the element type is Cube . Therefore you need to add a equals method to class Cube . I don't know what determines whether two Cube objects are equal, but I'll guess, according to your question, that they are equal if they have the same name , even when they have different length s. I will further assume that name cannot be null. Based on those assumptions, here is a equals method. You should add this method to 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;
}

Now, in method main of class PartFive you can use the following if to add a Cube to the list.

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

You can check for duplicate names in the cubelist array using lambda expressions (for better readability):

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

One thing that you should do is to remove the while(true) instruction which causes an infinite loop. Another suggestion is to display the name of objects contained by cubelist , to see that indeed the names are not duplicated:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM