2011-02-09 2 views
1

En C#, vous pouvez faire des opérations sur une liste, comme ceci:Élégante façon de faire des choses avec une liste (et autres) en Java

return myList.Average(p => p.getValue()); 

Cela renvoie à la moyenne de toutes les valeurs. Y a-t-il quelque chose de similaire en Java? (Cela me sauverait le calcul d'une somme et ensuite la division par le nombre d'éléments?)

Merci!

+0

http://stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq – SLaks

Répondre

4

Non, mais vous pouvez utiliser guava-librariesFunction et transform pour obtenir le même résultat. Voici an example

Vous pouvez également utiliser Lists.transform(...). Il appliquera la fonction aux mêmes éléments (aucune copie n'est créée).

+0

il faudrait tout un hack pour le faire via la fonction et de transformation (transformation est destiné à transformer n valeurs d'un type en n valeurs d'un autre, ne pas collecter une valeur commune). Que diriez-vous d'un exemple de code? –

0

Cela dépend du type de collection que vous créez. Je ne pense pas que les types Java Array natifs supportent une fonctionnalité comme celle-ci. Cependant, il existe d'autres collections qui peuvent faire ce genre de choses, par exemple Apache Commons Math a un certain nombre de structures pour faire ce genre de chose. Goyave est un autre paquet avec beaucoup de grandes méthodes Array intégrées.

Une autre option que l'on pourrait facilement mettre en œuvre serait d'étendre la collection que vous utilisez. Par exemple:

public class ArrayListExtension extends ArrayList{ 

    public ArrayListExtension(){} 

    public Double average() 
    { 
    Double sum = 0; 
    Iterator<Double> iterator = this.iterator(); 
    while(iterator.hasNext()){ 
     sum += iterator.next(); 
    } 
    return sum/this.size(); 
    } 
} 

Remarque: Il n'y a pas de contrôle de cohérence intégré à cela. Dans une implémentation réelle, vous voudriez essayer de vérifier que les valeurs sont des nombres réels.

+0

Je n'utiliserais pas 'float' esp quand vos valeurs sont' double'. –

+0

Bon point @Peter Lawrey. Editer la réponse pour retourner un double à la place. – dmcnelis

+0

Je n'utiliserais pas 'Double' non plus, sauf si vous voulez autoriser une valeur' null'. «double» est beaucoup plus efficace et plus concis. –

0

Vous pouvez faire ce qui suit pour obtenir la moyenne de certains nombres. Sauf si vous faites ce lot, il n'y a pas beaucoup d'économies.

public static double average(Collection<Number> coll) { 
    double total = 0; 
    for(Number n: coll) total += n.doubleValue(); 
    return total/coll.size(); 
} 
0

Voici une version sûre de la réponse de Peter Lawrey, en utilisant BigDecimal:

public static double safeAverage(final Collection<? extends Number> coll){ 
    BigDecimal dec = BigDecimal.ZERO; 
    for(final Number n : coll){ 
     dec = dec.add(BigDecimal.valueOf(n.doubleValue())); 
    } 
    return dec.divide(BigDecimal.valueOf(coll.size())).doubleValue(); 
} 

(Pas tout à fait cependant, en toute sécurité, comme BigInteger et BigDecimal étendre également Number sûr si elle est utilisée avec l'un des Number. implémentations dans java.lang)

Questions connexes