7
votes

Pourquoi les numéros de Java ne sont-ils pas iThables

Je ne peux pas me demander pourquoi je ne peux pas écrire quelque chose comme ça: xxx

à imprimer: xxx

i moyenne, 3 pourrait être automatiquement en boîte dans un entier , qui pourrait être ibler .
Je sais, j'ai sélectionné le premier élément à être 0 , mais je suppose que c'est le cas commun et qu'il pourrait faciliter la comptage avec un tel pour la construction .


3 commentaires

Il suffit d'utiliser une boucle régulière. Ce (pour INT I: N: N) ... n'est pas un idiome Java et essayant de chausse-pied, un autre style de langue va généralement vous courir en difficulté


@Emil: "Pourquoi les chiffres de Java ne sont-ils pas iThables"? Mais laissez-moi reformuler: "Pourquoi les entiers Java ne sont-ils pas ihansables de sorte qu'ils puissent être utilisés dans une boucle pour chaque boucle".


Je pense que ce serait un ajout très sensible à la langue. Oui, ce serait un nouveau idiome mais est lisible (IMHO), moins sujet d'erreur (le traditionnel de répétitions de boucle i 3 fois, par exemple) et pourrait probablement remplacer presque la moitié de la moitié de la boucle du monde . Si j'avais un nickel pour chaque pour (int j = 0; j erreur que j'ai faite ...


7 Réponses :


4
votes

in pour (x: c) Syntaxe, c doit être un ibler ; 3 n'est pas. Vous pouvez faire xxx


1 commentaires

Ne pas répondre à ma question et votre boucle n'est pas meilleure que l'ancien style C.



4
votes

vous iTERE sur des collections d'objets. et Integer est un seul objet il n'y a rien à parcourir. Cependant, vous pouvez simplement faire cela:

for(int i=0;i<number;i++)


1 commentaires

Exactement ce à quoi je pensais. La seule utilisation d'un pour (int i: 3) boucle serait sauvegarder le programmateur 10 caractères et faire plus de travail dans la fin de l'arrière ().



4
votes

en Java, le foreach La boucle seulement iTerate sur < forts> tableaux ou collections qui implémentent le ITEREFER Interface, que le type wrapper Integer ne le fait pas.

Mais cela a du sens quand on y pense. Que fait "pour chaque entier I dans 3, faites-le" signifie? Combien d'entiers sont dans 3? Commençons-nous à zéro, donc il y a 4 entiers (0,1,2,3)? Commençons-nous à 1? Est-ce que nous faisons-nous toujours toujours par un?

Si vous voulez imiter ce comportement, TheotherGuy 's La réponse va fonctionner, mais une boucle directe est probablement encore meilleure.


0 commentaires

1
votes

Nombre a des sous-classes non entières telles que Float et BigDecimal, il n'a donc pas de sens à implémenter des sur le numéro. Avoir entier et long implémenter > serait bien cependant.


1 commentaires

+1 n'a pas pensé à des chiffres de cette façon. Bien sûr, je ne veux que des entiers (parlant mathématiquement)



9
votes

Parce qu'un nombre n'est pas une plage. La conversion d'un nombre en une plage est ambiguë. Rien ne vous empêche d'écrire une classe de plage que est ibler, par exemple xxx

Notez qu'avec une telle approche, vous pouvez facilement ajouter des fonctionnalités telles que la spécification de l'incrément , si la portée est inclusive des deux côtés, etc.


1 commentaires

+1 pour la bonne réponse à My question: ambiguïté. Utiliser la solution de Matej. 10x pour le code.



10
votes

C'est une sorte de stupide, mais vous pouvez écrire quelque chose comme ceci: xxx pré>

si vous souhaitez une méthode d'importation statique: p>

public class IterUtil {

    public static Iterable<Integer> iter(int to) {
        return new IntIterable(0, to);
    }

    public static Iterable<Integer> iter(int from, int to) {
        return new IntIterable(from, to);
    }


    private static class IntIterable implements Iterable<Integer> {

        private int start;
        private int end;

        private IntIterable(int start, int end) {
            this.start = start;
            this.end = end;
        }

        @Override
        public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                private int actual = start;

                @Override
                public boolean hasNext() {
                    return actual != end;
                }

                @Override
                public Integer next() {
                    int value = actual;

                    if (actual < end) {
                        actual++;
                    } else if (actual > end) {
                        actual--;
                    }

                    return value;
                }

                @Override
                public void remove() {
                    // do nothing
                }
            };
        }
    }
}


2 commentaires

pas stupide du tout. En utilisant cela dans mes tests maintenant, et regardez à quel point ils sont lisibles! 10x.


Oh, et c'est pour (int i: plage (1,3)) qui produit 1,2,3 (inclus)



2
votes

Comme d'autres l'ont noté, Java pour chacun iTirate sur un tableau ou une collection. "3" n'est pas un tableau ou une collection, c'est une valeur unique. Si Java a permis à la construction que vous suggérez, la seule implémentation cohérente serait de "itérer" sur la valeur unique, 3. C'est-à-dire:

for (int i=0; i<=3; i=i+1)


0 commentaires