Java while Schleife zählt eins zu viel hoch

Am besten mal streams anschauen...macht vieles einfacher:
Code:
IntStream.range(1, 6).filter(i -> i % 2 == 0).boxed().forEach(i -> System.out.println(i));
 
@DarkAngel2401 danke dir, jetzt geht es. Jetzt muss ich nur noch verstehen warum :D
 
@dremba
Mal ein paar Varianten wie man so etwas machen könnte hingeklatscht :)

Java:
package cb.forum;

import java.util.stream.IntStream;

public class Main {

    public static void main(String[] args) {
        printDivisibleBy2_withJavaStreams(1,10);
        printDivisibleBy2_withForLoop(100,110);
        printDivisibleBy2_withWhileLoop(1000,1010);
    }

    public static void printDivisibleBy2_withJavaStreams(int startInclusive, int endInclusive) {
        IntStream
                .rangeClosed(startInclusive, endInclusive)
                .filter(num -> num % 2 == 0)
                .forEach(System.out::println);
    }

    public static void printDivisibleBy2_withForLoop(int startInclusive, int endInclusive) {
        for(int i=startInclusive; i <= endInclusive; i++) {
            if (i % 2 == 0) System.out.println(i);
        }
    }
    
    public static void printDivisibleBy2_withWhileLoop(int startInclusive, int endInclusive) {
        int currentNumber = startInclusive;
        while(currentNumber <= endInclusive) {
            if (currentNumber % 2 == 0) System.out.println(currentNumber);
            currentNumber++;
        }
    }
    
}
 
Zuletzt bearbeitet: (bugfix lol)
  • Gefällt mir
Reaktionen: dremba und Raijin
Wie #8 würde ich bei allem was mit zählen zu tun hat, zu einer Zählschleife raten. Dein Quellcode ist komisch.

Im Grunde macht dein Algorithmus aus dem Startthread folgendes:
Wenn gu gerade ist, also restlos durch 2 teilbar ist, dann erhöht er gu um 1, so dass gu ungerade wird und er gibt gu aus. So weit, so gut.

Im nächsten Durchlauf prüft er wieder, ob gu gerade ist. Ist es ja aber nicht und wird es auch nicht mehr sein, weil gu im else dann immer um zwei erhöht wird.

@DarkAngel2401 Die Ausgabe ist dann aber falsch, laut Startpost soll jede ungerade Zahl ausgegeben werden.

Java:
int gu = 1;
int go = 10;

gu = gu + gu%2 == 0 ? 1 : 2; //gu wird zu 3
//gu%2 ist entweder 0 oder 1, daher braucht es den ternären Vergleich nicht
gu = gu + gu%2 + 1; //gu wird ebenfalls zu 3
while (gu < go) {
    System.out.println(gu++);
    //Hier würde er jetzt, solange gu < go ist, jede Zahl ausgeben
    //In dem Fall also 3,4,5,6,7,8,9
}

Hier mal mein Vorschlag
Java:
int go = 10;
for(int gu = 1 + 1; gu < go; gu++) { // 1+1, da ja nur die Zahlen zwischen den Grenzen ausgegeben werden sollen
    if(gu%2 == 1) System.out.println(gu);
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: dremba
honky-tonk schrieb:
Am besten mal streams anschauen...macht vieles einfacher:
Code:
IntStream.range(1, 6).filter(i -> i % 2 == 0).boxed().forEach(i -> System.out.println(i));
Damit filterst du auf gerade Zahlen und in Range ist die lower boundary inklusive. Und da er schon weiß, dass er nur ungerade Zahlen ausgeben will, braucht er nicht den Einserinkrement von Range nehmen.

Streams gerne, aber nicht, wenn unnötig Overhead erzeugt wird wie für dieses Beispiel.
 
  • Gefällt mir
Reaktionen: dremba, BeBur und KitKat::new()
paccoderpster schrieb:
@DarkAngel2401 Die Ausgabe ist dann aber falsch, laut Startpost soll jede ungerade Zahl ausgegeben werden.
Beim Absenden gesehen und den Post innerhalb 1 Minute noch 4 mal korrigiert :)

Zum ternären Operator: Ich persönlich finde es so lesbarer, funktionieren tut natürlich beides. Geschmackssache eben.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: paccoderpster
DarkAngel2401 schrieb:
Streams gerne, aber nicht, wenn unnötig Overhead erzeugt wird wie für dieses Beispiel.
und ich hab mich schon gewundert, warum mein PC so langsam wurde als ich das ausgeführt habe. ;-)

aber ja, du hast recht, kann man optimieren
 
pmkrefeld schrieb:
@dremba
Mal ein paar Varianten wie man so etwas machen könnte hingeklatscht :)

Java:
package cb.forum;

[...]
Ohne Polymorphie ist es kein wahrhaftiges OOP und ohne Interfaces kein wahrhaftiges Java, von daher ist das eine recht enttäuschende Lösung /s
 
BeBur schrieb:
Ohne Polymorphie ist es kein wahrhaftiges OOP und ohne Interfaces kein wahrhaftiges Java, von daher ist das eine recht enttäuschende Lösung /s

Challenge accepted:
(kompilliert nur unter java 17 preview oder neuer :P)

Java:
package cb.forum.maxOOP;

public class OOP {

    public interface Modal<T> {
        boolean isModeOf (T divisor);
    }

    public record ModalInteger<T extends Integer>(T n) implements Modal<T> {

        @Override
        public boolean isModeOf(T divisor) {
            return n.intValue() % divisor.intValue() == 0;
        }
    }

    public record ModalString<T extends String>(T s) implements Modal<T> {

        @Override
        public boolean isModeOf(T divisor) {
            return s.replace(divisor, "").isBlank();
        }
    }

    public static class ModalFactory {

        public <T, M extends Modal<T>> M getModalOf(T candidate) {
            return switch (candidate) {
                case Integer num -> (M) new ModalInteger(num);
                case String s -> (M) new ModalString(s);
                default -> throw new IllegalArgumentException();
            };
        }
    }

    public static void main(String[] args) {
        ModalFactory factory = new ModalFactory();

        Modal<Integer> intTest = factory.getModalOf(10);
        System.out.println("Integer modality test: " + intTest);
        System.out.println("integer is mode of 2: " + intTest.isModeOf(2));
        System.out.println("integer is mode of 3: " + intTest.isModeOf(3));

        Modal<String> stringTest = factory.getModalOf("TestTestTest");
        System.out.println("String modality test: " + stringTest);
        System.out.println("string is mode of 'Test': " + stringTest.isModeOf("Test"));
        System.out.println("string is mode of 'Tes': " + stringTest.isModeOf("Tes"));
    }

}
 
  • Gefällt mir
Reaktionen: ReignInBlo0d, andy_m4, dremba und 2 andere
pmkrefeld schrieb:
Challenge accepted:
(kompilliert nur unter java 17 preview oder neuer :p)

Java:
package cb.forum.maxOOP;

[...]
Perfekt! Und auch mit Factory, so wie es sich gehört :D.
[/Thread] Das kann der TE jetzt ja 1:1 so nehmen. :freaky:
 
  • Gefällt mir
Reaktionen: pmkrefeld
  • Gefällt mir
Reaktionen: pmkrefeld
Zurück
Oben