web-dev-qa-db-fra.com

Condition pour vérifier si une valeur existe dans une liste contenant des objets,

J'essaie d'écrire une condition if pour vérifier qu'une valeur existe dans une liste contenant de nombreux objets, Voici mon code:

List<TeacherInfo> teacherInfo=ServiceManager.getHelperService(TeacherManagementHelper.class, request, response).getTeacherInfoId();
if(teacherInfo.contains(inputParam))
{
    out2.println("<font color=red>");
    out2.println("Id Not Available");
    out2.println("</font>");
 }
 else
 {
    out2.println("<font color=green>");
    out2.println("Id Available");
    out2.println("</font>");        
 }

après avoir exécuté la 1ère phrase, la méthode getTeacherInfoId() renvoie avec succès une liste d'objets. Dans ces objets, je souhaite vérifier que tout objet a la même valeur que inputParam. Est-ce que mon code ci-dessus est correct? Si vous vous trompez, aidez-moi.

5
Raghavendra

contains(Object o) est basé en interne sur equals entre les objets de votre liste et votre entrée, comme indiqué dans le document doc .

Puisque vous avez dit que inputParam est un entier, l'état actuel de votre code ne peut pas fonctionner car vous comparez un entier à des objets TeacherInfo, ils ne seront donc jamais égaux. Je crois que vous voulez comparer inputParam à un champ particulier d'objets TeacherInfo.

Si vous utilisez Java 8, vous pouvez utiliser l'API de flux au lieu de contains():

List<TeacherInfo> teacherInfo=ServiceManager.getHelperService(TeacherManagementHelper.class, request, response).getTeacherInfoId();
if (teacherInfo.stream().anyMatch(ti -> ti.getId() == inputParam)) {
    // contains the id
} else {
    // does not contain the id
}

Pour les versions précédentes de Java, une alternative à contains() consisterait à parcourir votre liste et à comparer manuellement votre entier au champ TeacherInfo:

private static boolean containsTeacherId(List<TeacherInfo> teacherInfos, int id) {
    for (TeacherInfo ti : teacherInfos) {
        if (ti.getId() == inputParam) { // I used getId(), replace that by the accessor you actually need
            return true;
        }
    }
    return false;
}

Ensuite:

List<TeacherInfo> teacherInfo=ServiceManager.getHelperService(TeacherManagementHelper.class, request, response).getTeacherInfoId();
if (containsTeacherId(teacherInfo, inputParam)) {
    // contains the id
} else {
    // does not contain the id
}

Remarque: Si vous n'avez pas besoin d'autres informations que l'ID lui-même, je suggérerais plutôt de renvoyer la liste des ID à partir d'une méthode appelée getTeacherIds(), en particulier si cette information provient d'une base de données.

19
Joffrey

Vous devez parcourir la liste teacherInfo et comparer chaque élément de cette liste avec inputParam.

Vous trouverez ci-dessous un petit code de démonstration qui pourrait vous aider.

J'ai créé un testeurInfo analogue à votre professeurInfo et à un paramètre analogue à votre entréeParam.

Tester.Java

/**
 * 
 */
package com.demo;

/**
 * @author Parul
 *
 */
public class Tester {

    private int id;
    private String name;
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    public Tester(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public Tester() {

    }

}

Demo.Java

/**
 * 
 */
package com.demo;

import Java.util.ArrayList;
import Java.util.List;

/**
 * @author Parul
 *
 */
public class Demo {

    public static void main(String [] args){

        List<Tester> testerInfo=new ArrayList<Tester>();
        testerInfo.add(new Tester(1,"Java"));
        testerInfo.add(new Tester(2,"C++"));
        testerInfo.add(new Tester(3,"Python"));
        testerInfo.add(new Tester(4,"C"));
        Tester tester=null;
        int param=2;
        for(int i=0;i<testerInfo.size();i++){
            tester=testerInfo.get(i);
            if(tester.getId()==param){
                System.out.println("param found: "+tester.getName());
                break;
            }

        }


    }


}

OUTPUT
param found: C++
0
Parul S

Non, ça ne marchera pas du tout. vous devriez itérer la liste 'teacherInfo' et vous devez remplacer les options compare () et hashvalue () de la classe d'objet. 

0
coder1608