Filter

Diskutiere Filter im Java Basics - Anfänger-Themen Bereich.
A

Adriano10

Code:
public  interface Sequence {
    
    int getNext();
}

public class Naturals implements Sequence{
    
    private int value = 0;
    
    Naturals(){
        
    }
    
    public Naturals(int zahl){
        this.value = zahl;
    }

    public int getNext(){   

    
    return value++;
        
    }
    
    public static void main(String[] args) {
        
        Sequence s = new ZapMultiples(3, new Naturals());
        while(s.getNext() < 100) {
        System.out.println(s.getNext());
    
        }
    Warum bekomme ich ergebnis 1 3 5 7 9 11 13 15 17 anstatt 1 2 3 4 5 usw?
    
    Und wie kann ich getNext() erweitern, so dass jede 3-e Element absorbiert wird, z.B
    1 2 4 5 7 8 10 usw...
    
    Vielen Dank im Voraus...
 
H

httpdigest

Du brauchst schonmal eine Schleife (oder Rekursion) in ZapMultiples.getNext(), um solange aus der darunterliegenden Sequence Zahlen zu ziehen, bis die gezogene Zahl kein Vielfaches (des ersten Konstruktorparameters von ZapMultiples(int, Sequence)) ist.
 
A

Adriano10

Du brauchst schonmal eine Schleife (oder Rekursion) in ZapMultiples.getNext(), um solange aus der darunterliegenden Sequence Zahlen zu ziehen, bis die gezogene Zahl kein Vielfaches (des ersten Konstruktorparameters von ZapMultiples(int, Sequence)) ist.
Danke für den Hinweis, aber klappt es leider nicht trozdem... Ich bin wieder auf dem falschen Weg
Code:
public class ZapMultiples extends Filter {
    private int base;
    private int zahl = 1;

    ZapMultiples(Sequence s) {
        super(s);
    }

    ZapMultiples(int zahl, Sequence s) {
        super(s);
        this.base = zahl;
    }

    public int getZahl() {
        return base;
    }

    public void setZahl(int zahl) {
        this.base = zahl;
    }

   
    public boolean absorbieren(int zahl) {
        return zahl % base != 0;
    }
   
    public int getNext() {
   
        int result = zahl;
        if(absorbieren(zahl))
        zahl++;
       
        return result;
       
   
    }
       


}
 
H

httpdigest

Wie sieht denn die Klasse Filter aus, und was ist ihr genauer Zweck, ausser, dass sie vermutlich einfach nur an eine darunterliegende Sequence delegiert?
 
H

httpdigest

Oh mann, also ich kürz das mal ab hier:
Filter hätte ich so gebaut, dass es eine darunterliegende Sequence bekommt und ein Prädikat, das angibt, ob ein Element nun herausgefiltert werden soll oder nicht:
Java:
abstract class Filter implements Sequence {
  private final IntPredicate predicate;
  private final Sequence delegate;
  Filter(IntPredicate predicate, Sequence delegate) {
    this.predicate = predicate;
    this.delegate = delegate;
  }
  @Override
  public int getNext() {
    int num;
    do {
      num = delegate.getNext();
    } while (!predicate.test(num));
    return num;
  }
}
Dann hätte ich ZapMultiples so umgesetzt:
Java:
class ZapMultiples extends Filter {
  public ZapMultiples(int factor, Sequence delegate) {
    super(i -> i % factor != 0, delegate);
  }
}
 
A

Adriano10

Code:
Die Klasse, die ich entwickelt habe, aber wie ich jetzt noch weiterkomme, weiss ich leider
nicht, so dass bei dem Aufruf getNext() auf der Konsole 1, 2, 4, 5, 7, 8, 10 angezeigt
wird

public  interface Sequence {
    
    int getNext();
    

}

public class Naturals implements Sequence{
    
    private int value = 0;
    
    Naturals(){
        
    }
    
    public Naturals(int zahl){
        this.value = zahl;
    }

    public int getNext(){   

        
    
    return value++;
        
    }
    

    public static void main(String[] args) {
        
        Sequence s = new ZapMultiples(3, new Naturals());
    //    Sequence s = new Naturals();
        //Sequence s = new Primes();
        while(true) {
        System.out.println(s.getNext() + " ");
    
        }
        
    
    }
}

public abstract class Filter implements Sequence{
    
    private  Sequence s;
    Filter(){
        
    }
    protected Filter(Sequence s) {
        this.s = s;
    }
    
    public int getNext() {
    return    s.getNext();
    }
}

public class ZapMultiples extends Filter {
    private int base;
    private int zahl = 1;

    ZapMultiples(Sequence s) {
        super(s);
    }

    ZapMultiples(int zahl, Sequence s) {
        super(s);
        this.base = zahl;
    }

    public int getZahl() {
        return base;
    }

    public void setZahl(int zahl) {
        this.base = zahl;
    }

    
    public boolean absorbieren(final int zahl) {
        return zahl % base != 0;
    }
    
    public int getNext() {
    
        int result = 0;
        
        
         while(zahl > 0) {
             zahl++;
            
         }
         if(!absorbieren(zahl)) {
                 result++;
             }
        
        return result;
        
    
    }
        


}

public class Primes extends Filter {

    private int value = 0;

    public int getNext() {
        final int result = value;
        if (value == 2)
            value = 3;
        else
            do
                value += 2;
            while (value > 0 && !isPrime(value));
        return result;
    }

    public static boolean isPrime(final int n) {
        if (n == 2)
            return true;
        if (n % 2 == 0)
            return false;
        final int zahl = (int) Math.sqrt(n);
        for (int t = 3; t <= zahl; t += 2)
            if (n % t == 0)
                return false;
        return true;
    }
}
 
MoxxiManagarm

MoxxiManagarm

while(s.getNext() < 100) { System.out.println(s.getNext()); }
Warum bekomme ich ergebnis 1 3 5 7 9 11 13 15 17 anstatt 1 2 3 4 5 usw?
Das ist im übrigen passiert, weil du 2x getNext aufgerufen hast für einen Vorgang, 1x in der Bedingung und 1x beim Ausgeben. Dadurch wurde immer die Zahl aus der Bedingung verschluckt.
 
Thema: 

Filter

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben