2017-10-12 8 views
0

J'ai la carte suivante:la taille de la liste Déterminer dans Carte <Entier, Liste <String>> dans JSTL <c:if>

Map<Integer, List<String>> namesById= new HashMap<>() ; 

Je veux itérer la carte dans jsp. Cependant, je veux d'abord vérifier si la taille de la liste est supérieure à un certain nombre en premier.

donc ce que je veux est-ce (mettre le numéro de test à des fins de démonstration):

if (namesById.get(1).size() > 3) 
for (String s: namesById.get(1)){ 
     do something 
    } 

que je dois faire dans JSP. Comme je suis débutant en JSTL, je ne sais pas exactement comment l'écrire et il est difficile de déboguer. J'ai essayé avec cette expression:

<c:if test="${fn:length(namesById[1]) gt 3}" 

</c:if> 

Donc ce que je veux faire est:

  1. d'abord obtenir la liste de la carte en donnant la clé spécifique
  2. Vérifiez ensuite si la taille de la liste est plus un certain nombre
  3. et puis itérer dans la liste

Répondre

2

C'est parce que

Integer.valueOf(1).equals(Long.valueOf(1)) 

est toujours false.

En langage d'expression, ${1} est interprété comme Long et cela ne correspond pas à la clé Integer. Fondamentalement, vous faites effectivement un namesById.get(1L) ici.

Modifiez votre carte pour qu'elle soit Map<Long, List<String>> et cela fonctionnera.

-1

en utilisant jstl vous pouvez obtenir la clé et la valeur de la carte. En utilisant cette valeur, vous pouvez vérifier la taille. Vérifiez l'exemple suivant.

<% 
    Map<Integer, List<String>> namesById = new HashMap<Integer, List<String>>(); 

    List<String> list = new ArrayList<String>(); 
    list.add("1"); 
    list.add("2"); 
    list.add("3"); 
    list.add("4"); 
    namesById.put(1, list); 

    list=new ArrayList<String>(); 
    list.add("3"); 
    list.add("4"); 
    namesById.put(2, list); 
    pageContext.setAttribute("itemList", namesById); 
%> 


<c:forEach items="${itemList}" var="entry"> 
    <c:if test="${fn:length(entry.value) gt 3}"> 
    Value > 3 
    </c:if> 
</c:forEach> 
+0

Pourquoi downvoted? –