我正在尝试搜索对象的ArrayList以获取重复项,如果它不存在则添加新对象

时间:2016-05-15 16:37:59

标签: java arraylist

我有一个名为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 个答案:

答案 0 :(得分:1)

你宣布了#34;没有匹配&#34;太快了:在添加新主题之前,您需要遍历整个列表。

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

为了解决这个问题,请创建一个名为&#34;找到&#34;的布尔变量,在循环之前将其设置为false,然后搜索匹配项。找到匹配项后,将变量设置为true,然后中断。

循环后检查你的变量。如果确实如此,请不要添加,并说您发现了重复内容。否则,添加新主题。

答案 1 :(得分:-1)

在您的情况下,您无法检查&#39;包含&#39;你必须手动检查每个条目是否相同。

覆盖主题的equal()函数:

boolean found = false;
for(Subject s : subjectList){
   if(s.equal(newSubject)){
      found = true;
      break;
   }
}
if(!found) //add new entry

然后在你的循环中:

import os
x1 = []
y1 = []
p1 = []
Xtotal = []
Ytotal = []
listcount = 0
def stockage(z):
    compteur = 0
    del x1[:]
    del y1[:]
    del p1[:]
    for ligne in z :
        if ligne[0:1]=='#':
            pass
        else:
            if ligne[0:1]=='p':
                p1.append(float(ligne[2:]))
            else:
                compteur = compteur + 1
                if compteur%2 == 0 :    
                    y1.append(float(ligne.rstrip()))
                else:
                    x1.append(float(ligne.rstrip()))
    Xtotal.append(x1)
    Ytotal.append(y1)
    print(Xtotal)
for fichier in os.listdir('data/'):
    fichierOuvert = open("data/"+fichier, "r")
    listetotale=stockage(fichierOuvert)
    fichierOuvert.close()
print(Xtotal)
print(x1)
print(y1)
print(p1)

答案 2 :(得分:-1)

如果Subject实施equals(),则创建对象并致电subjectList.contains(subject)。更好的是,也要实施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));