当前位置: 首页 > 知识库问答 >
问题:

我试图搜索一个ArrayList中的重复对象,如果它不存在,则添加新对象

皇甫敏达
2023-03-14

我有一个名为Subject的类,它将存储一些信息,比如主题名称和主题代码,我很难做到,因为我试图让它在arraylist中的记录列表中循环,如果它不存在,则添加新记录。请帮忙,我试着在这里寻找答案,但似乎找不到。

如果循环不是正确的做法,请告诉我正确的方向。谢谢

//The Class

public class Subject {
    private String name;
    private String subjectCode;

    public Subject(){    
    }

    public Subject(String name, String subjectCode){
        this.name = name;
        this.subjectCode = subjectCode;
    }

    public String getName(){
        return this.name;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getSubjectCode(){
        return this.subjectCode;
    }

public void setSubjectCode(String subjectCode){
    this.subjectCode = subjectCode;
}


//The Main method

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    ArrayList<Subject> subjectList = new ArrayList<>();

    //Test records
    subjectList.add(new Subject("Java 1", "ITC101"));
    subjectList.add(new Subject("Java 2", "ITC201"));
    subjectList.add(new Subject("Java 3", "ITC301"));


    String newGetName;
    String newSubjectCode;


    do {
        System.out.print("Enter Subject Name: ");
        newGetName = input.nextLine();

        System.out.print("Enter Subject Code: ");
        newSubjectCode = input.nextLine();

        for(int i = 0; i < subjectList.size(); i++){
            if(!subjectList.get(i).getName().contains(newGetName) && !subjectList.get(i).getSubjectCode().contains(newSubjectCode)){
            subjectList.add(new Subject(newGetName, newSubjectCode));
            } else {
                    System.out.println("We have a match ");

            }
        }
    } while(!"0".equals(newGetName));


}

共有3个答案

高运诚
2023-03-14

如果Subject实现了equals(),则创建对象并调用subjectList。包含(主题)。更好的方法是,也实现hashCode(),并将ArrayList更改为HashSet(或者LinkedHashSet,如果顺序很重要)以获得更好的性能。

否则,像这样搜索(使用equals(),而不是contains(),进行字符串比较):

boolean found = false;
for (Subject subject : subjectList)
    if (subject.getName().equals(newGetName) && subject.getSubjectCode().equals(newSubjectCode)) {
        found = true;
        break;
    }
if (found)
    System.out.println("We have a match ");
else
    subjectList.add(new Subject(newGetName, newSubjectCode));
蒯卓君
2023-03-14

在你的情况下,你不能检查“包含”,你必须手动检查每个条目是否相同。

覆盖主体的equal()函数:

public boolean equal(Object o){
   Subject b = (Subject) o;
   return (this.name.equal(b.name) && this.code.equal(b.code));
}

然后在你的循环中:

boolean found = false;
for(Subject s : subjectList){
   if(s.equal(newSubject)){
      found = true;
      break;
   }
}
if(!found) //add new entry
徐学潞
2023-03-14

你过早地宣布“不匹配”:在添加新主题之前,你需要浏览整个列表。

你的程序尝试第一个主题,如果ut不匹配,它会添加一个主题,然后继续。不幸的是,它没有中断,因此它会不断为每个不匹配的现有主题添加相同的主题。

为了解决这个问题,制作一个名为“找到”的布尔变量,在循环前将其设置为false,并搜索匹配项。一旦找到匹配项,将变量设置为true,并中断。

循环结束后,检查变量。如果是真的,不要添加,并说你发现了一个副本。否则,添加新主题。

 类似资料:
  • 对于我当前的项目,我必须搜索ArrayList of ZipCode对象,以便找到距离用户输入的int zip最远的ZipCode。 下面是编写我遇到问题的方法的说明:public ZipCode findfurtwest(int-pZip)-查找距离提供的邮政编码最远的ZipCode。如果未找到邮政编码,则返回null。例如,距离邮政编码75234最远的是ADAK,AK 99546。 在我的代码

  • 如果我有以下对象数组: 是否有一种方法可以在数组中循环,以检查特定用户名值是否已经存在,如果它什么也不做,但如果它不做,则使用所述用户名(和新ID)向数组中添加一个新对象? 谢谢!

  • 问题内容: 我有一堂课。它具有以下特征; 它具有2个属性,和。1个人可以拥有许多电话,因此您可能会在下面看到具有多个ID的人。 还有另一门课叫。它将有一个称为的方法。 personList,具有3-4个Person对象。我需要搜索PersonArrayList并找到与Person对象匹配的对象。我怎样才能做到这一点? 注意:我尝试过。但这是行不通的。 问题答案: 我尝试了personList.co

  • 我试图在我的envers表中查找一个对象,但是我没有PK。代替PK,我有一个字段(“孩子”)。这是我的疑问, 列表结果列表=读卡器。createQuery()。用于修改实体(TP.class、false、true)。添加(AuditEntity.property(“子”)。eq(nodeid))。getResultList(); 但是我明白了: 原因:org。冬眠PropertyNotFoundE

  • 问题内容: 我有一个特定的类C的arraylist。 C类具有两个属性,即。 现在,当我将C类型的对象添加到ArrayList myList时,我想检查列表中是否已经存在对象,且其str1和str2的值与该对象的参数值(str1和str2)相匹配我要补充。 有什么有效的方法可以执行此操作,而不必每次都遍历完整列表并检查参数之间是否匹配? 问题答案: 您需要重写C类中的方法。 例如 然后,可以调用m

  • 我试图根据用户输入找到一个特定的对象。用户需要输入姓名和性别,然后程序应该搜索ArrayList,查看是否有匹配的姓名和性别。ArrayList中的对象有3个实例变量,但程序只搜索2个。如何在ArrayList中只搜索选定的几个特征? 在我的项目中,我有: 其中,nameList是ArrayList的名称,getName()是返回存储在对象中的名称的方法的名称,getGender()是返回存储在对