2010-10-26 7 views
4

fonction gamme de PHP travail comme celui-ci en php:fonction de gamme de PHP en Java

$leap_years = range(1900, 2000, 4); 

crée tableau comme 1900, 1904, 1908, ... Y at-il quelque chose de simple comme celui-ci en Java?

+4

être conscient du fait que 1900 est saute pas. – hummingBird

+3

@OP: Votre définition d'une année bissextile n'est pas très précise ... Les années divisibles par 100 et non divisibles par 400 ne sont pas des années bissextiles;) – NikiC

+0

Merci les gars de me souvenir, même si je vais partir comme ça, cette Ce n'est pas le but de la question. – Centurion

Répondre

4

Il n'y a rien de prévu pour cela, mais il est relativement simple d'implémenter une plage telle qu'un Iterable<Long> immuable (ou Integer ou autre). Il suffit de créer un Iterator personnalisé qui commence à la valeur de départ, puis incrémenter pour chaque appel à next() jusqu'à ce que vous transmettiez la valeur de fin. Vous devez décider comment et si vous voulez gérer l'itération de haut en bas et ainsi de suite, mais ce n'est pas difficile. Vous pouvez également le faire comme une implémentation non modifiable de List où la valeur de chaque index est calculée sur demande (start + index * increment). Alors que votre question se réfère à la création d'un "tableau" basé sur la plage, un tableau complet de données sur l'ensemble de la plage n'est souvent pas nécessaire, en particulier si vous voulez juste parcourir les nombres dans la plage. Si c'est tout ce que vous voulez, vous finirez par itération à travers les numéros dans la plage deux fois pour créer un tableau ou List puis lisez-le. Utiliser un itérateur paresseux tel que je l'ai décrit n'a pas cet inconvénient. De plus, un itérateur paresseux peut facilement être copié dans un List si vous voulez directement toutes les valeurs stockées dans la mémoire. Le seul désavantage par rapport à la construction d'un tableau est un overhead autoboxing.

1

Vous pouvez simulez comme ceci:

public int[] range(int startVal, int endVal, int increment) { 
    if (startVal >= endVal) { 
    //handle error or add option to go backwards 
    } 
    int count = ((endval - startval)/increment) + 1; 
    int[] myArr = new int[count]; 
    for (int i=0; i <= count; i++) { 
    myArr[i] = startVal + (i * increment); 
    } 
    return myArr; 
} 
}
+3

Vous ne pouvez pas utiliser de primitives avec des génériques. – ColinD

+0

'ArrayList ' devrait être 'ArrayList ' –

+0

Bon point, merci. Je n'ai pas Java ici au travail pour le tester. :( –

3

Vous devriez le faire de cette façon:

public int[] range(int start, int end, int increment) { 
    if (start < end && increment < 0) throw new IllegalArgumentException(); 
    if (start > end && increment > 0) throw new IllegalArgumentException(); 

    int[] values = new int[Math.abs((end - start)/increment) + 1]; 
    boolean reverse = start > end; 

    for (int i = start, index = 0; reverse ? (i >= end) : (i <= end); i+=increment, ++index) 
    { 
     values[index] = i; 
    } 
    return values; 
} 
+0

Je suppose que cela ne fonctionnerait pas avec des plages inverses comme 'range (2000, 1000, 100);'. – whiskeysierra

+0

@Willi: En effet, j'ai édité ma méthode, mais pas testé ... –