2011-09-01 14 views
5

Tengo una lista con los elementos duplicados, tengo que usar la velocidadCómo eliminar elementos duplicados de una lista usando la velocidad Apache

por ejemplo, mensajes contiene elementos duplicados

#foreach ($p in $posts) 
    $p.name //will be unique 
#end 

Quiero eliminar la duplicar el uso de la velocidad,

Cualquier ayuda se agradece

+2

Tales cosas deben resolverse en el lado de Java, Velocity no fue diseñado para construir estructuras de datos. – serg

Respuesta

1

no se puede hacer eso en la velocidad. Debe proporcionar un modelo que no contenga duplicados. La forma más sencilla es utilizar new HashSet<Post>(postsList) - esto eliminará los duplicados (basado en el método equals(..))

Si realmente no puede pasar el modelo adecuado, se puede tratar de definir un custom tool que toma una lista y devuelve un conjunto , pero eso no sería fácil.

0

Además de no ser posible en Velocity, desde el punto de vista arquitectónico, lo que quiere no tiene ningún sentido. La parte de "eliminar duplicados" es una especie de lógica y esto debe ser atendido en el lugar apropiado. Una vista no es el lugar correcto para hacer eso. Por lo tanto, debes hacerlo por todos los medios en Java e incluso estar contento de que no sea posible en Velocity.

Incluso si su función no permite cambiar el código de Java, esto aún debe resolverse en Java.

5

Solo por el argumento, porque otros dijeron que no es posible con Velocity, quería mostrar que en realidad es posible con Velocity, pero aún así no es recomendable.

Para aquellos que estén interesados ​​cómo se podría hacer:

#set($uniquePosts = []) 
#foreach($post in $posts) 
    #set($exists = false) 
    #foreach($uniquePost in $uniquePosts) 
     #if($uniquePost.name == $post.name) 
      #set($exists = true) 
      #break 
     #end 
    #end 

    #if(!$exists) 
     #set($added = $uniquePosts.add($post)) 
    #end 

    #set($posts = $uniquePosts) 
#end 

Unique list: 
#foreach($post in $posts) 
    $post.name 
#end 
+0

Muchas gracias, se solucionó el problema – imby

+1

Es aún más fácil con las versiones más nuevas, ya que puede utilizar el método 'contiene' en la lista. por lo que puede usar un solo bucle foreach y agregar todos los objetos a una lista, que no están ya contenidos, o incluso puede usar el tipo de mapa velocit y guardar los elementos como claves ;-) – Falco

3

Esto es posible, y esto debería funcionar dependiendo de la versión de la velocidad. Un poco más conciso que la respuesta anterior.

#set($uniquePosts = []) 
#foreach($post in $posts) 
    #if(! $uniquePosts.contains($post.name) ) 
     #if($uniquePosts.add($post.name)) #end 
     ##note the if above is to trap a "true" return - may not be required 
     $post.name 
    #end 
#end 
Cuestiones relacionadas