Interfejsy, podstawy

0

Witam wszystkich jak widać po poście jestem tu nowy i od razu walne z grubej rury, mianowicie posiadam problem z Interfejsami w Javie. Mam takie zadanie:

Zdefiniować klasę Incrementor w taki sposób, aby następujący kod:

package incr;
import static incr.Incrementer.*;

public class Test {
  
  public static void main(String[] args) {
    
    // najprostsza iteracja - krok = 1
    for(int k : in(1, 10)) System.out.print(k + " ");
    System.out.println();
    
    // Podany krok
    for(int k : in(1, 10).by(2)) System.out.print(k + " ");
    System.out.println();
    
    // Można w odwrotną stronę - tu domyślnie krok = -1
    for(int k : in(10, 1)) System.out.print(k + " ");
    System.out.println();

    // Ale można zakres formułować od min do max, a podany krok będzie 
    // decydował o kierunku iteracji
    for(int k : in(1, 10).by(-1)) System.out.print(k + " ");
    System.out.println();
    
    // W trakcie iteracji można zmieniac krok
    Incrementer inc;
    for (int i : inc = in(1,10) ) {
      if (i == 4) inc.by(2);
      System.out.print(i + " ");
    }
    System.out.println();
    for (int i : inc = in(1,10) ) {
      if (i == 8) inc.by(-2);
      System.out.print(i + " ");
    }
    System.out.println();
    for(int k : inc = in(10, 1)) {
      if (k == 5) inc.by(1);
      System.out.print(k + " ");
    }

  }

}

Incrementer winien implementować interfejs Iterable
Patent polega na tym, żeby nie używać w programie tablic ani kolekcji (chodzi o klasę Inkrementer). Inkrementer winien implementować interfejs Iterable i wszystkie metody powinny się w niej znajdować.

Ja osobiście stworzyłem sobie interfejs o nazwie Incrementer i nabazgrałem trochę kodu (od razu napiszę, że jest niepoprawny i to bardzo mocno) -dokładnie 2 wersje można rzec:

package incr;
import java.util.Iterator;
import incr.Test.*;

public interface Incrementer{
	public class Interable implements Iterable <Integer> {
	
	public static int min, max, war;

	public static Iterator in(int x, int y){
		return new Iterator(min,max);
	}
}
	@Override
	public Iterator<Integer> iterator() {
		// TODO Auto-generated method stub
		return null;
	}
	

}	
}

To daje dużo błędów.
Natomiast to jest całkiem przyzwoite:

package incr;
import java.util.Iterator;
import incr.Test.*;

public interface Incrementer
public static Iterator  in(int min, int y){
		return new Iterator() {

            public  int hasNext(int min) {
                return min;
            }

            public Object next() {
                throw new UnsupportedOperationException("Not supported yet.");
            }

            public void remove() {
                throw new UnsupportedOperationException("Not supported yet.");
            }

			@Override
			public boolean hasNext() {
				// TODO Auto-generated method stub
				return false;
			}
        };
	}

A zapmniał bym o najważniejszym program ma zwracać wynik

1 2 3 4 5 6 7 8 9 10 
1 3 5 7 9 
10 9 8 7 6 5 4 3 2 1 
10 9 8 7 6 5 4 3 2 1 
1 2 3 4 6 8 10 
1 2 3 4 5 6 7 8 6 4 2 
10 9 8 7 6 5 6 7 8 9 10

Za każdą pomoc będe wdzięczny, ponieważ siedzę nad tym już naprawdę długo, dużo równiez przeczytałem i nadal znajduję się w tym samym miejscu.
Najbardziej by mi zależało na pokazaniu jakiejś metody dzięki której mógłbym sie dostać do klasy Test i zdefiniować in, albo jakoś mnie naprowadzić, abym mógł w SPACJA końcu skończyć to zadanie bo jeszcze trochę i zacznę walić głową w klawiaturę.
PS
Posta o interfejsach na forum czytałem. :|

Pozdrawiam

0

Witam, na prędkości przeczytałem, moze to Ci się przyda:

interface Selector {
		boolean end();
		Object current();
		void next();
	}
	
public class Sequence {
		
		private Object[] items;
		private int next=0;
		
		public Sequence(int size) {
			items = new Object[size];
		}
		public void add(Object x) {
			if(next < items.length) {
				items[next++] = x;
			}
		}
		
		protected class SequenceSelector implements Selector {
			protected int i=0;
			public boolean end() { return i==items.length;}
			public Object current() { return items[i]; }
			public void next() { if(i<items.length) i++; }
		}
	
			public Selector selector() {
				return new SequenceSelector();
			}
			public Selector reverseSelector(final int y) {
				return new SequenceSelector() {
					{super.i = y;}
					public boolean end() { return i<0;}
					public void next() { if(i>=0) i--; }
					
					
				};
			}
			
		
			public static void main(String[] args) {
				Sequence sequence = new Sequence(10);
				for(int i=0; i < 10; i++) 
					sequence.add(Integer.toString(i));
				Selector selector = sequence.selector();
				while(!selector.end()) {
					System.out.print(selector.current() + " ");
					selector.next();
				}
				System.out.println("Reverse");
				selector=sequence.reverseSelector(9);
				while(!selector.end()) {
					System.out.print(selector.current() + " ");
					selector.next();
				}
				
				
				
			}
			
		}

i to:

	interface Incrementable {
		void increment();
	}
	
	class Callee1 implements Incrementable {
		private int i=0;
		public void increment() {
			i++;
			System.out.println(getClass().getName()+": "+i);
		}
	}
	
	class MyIncrement {
		public void increment() { System.out.println("Inna operacja");}
		static void f(MyIncrement mi) { mi.increment();}
	}
	
	class Callee2 extends MyIncrement {
		private int i=0;
		public void increment() {
			super.increment();
			i++;
			System.out.println(getClass().getName()+": "+i);
		}
		private class Closure implements Incrementable {
			public void increment() {
				Callee2.this.increment();
			}
		}
		Incrementable getCallbackReference() {
			return new Closure();
		}
	}
	
	class Caller {
		private Incrementable callbackReference;
		Caller(Incrementable cbh) {callbackReference = cbh; }
		void go() {callbackReference.increment();}
	}

	
	public class Callbacks {
		public static void main(String[] args) {
			Callee1 c1 = new Callee1();
			Callee2 c2 = new Callee2();
			MyIncrement.f(c2);
			Caller caller1 = new Caller(c1);
			Caller caller2 = new Caller(c2.getCallbackReference());
			caller1.go();
			caller1.go();
			caller2.go();
			caller2.go();
		}
		
}


Jak będę poźniej miał troche czasu to spróbuje pomóc.
Pozdrawiam

0

a poza tym to interfejs zrobiłbym inaczej, jest napisane implementować, co oznacza że nie koniecznie to musi być z użyciem implements, dziedziczenie też można do tego podpiąć, dobrze gadam?, a tak chyba będzie Ci łatwiej, i wtedy już nie będzie tej brzydkiej klasy wewnętrznej w interfejsie:

public interface Incrementer extends Iterable{
  
       //........
}    
0

Oki, posiadam już cos takiego (ogólny szkic)

package incr;
import java.util.Iterator;
public class Incrementer implements Iterable<Integer> {

	public static Incrementer in(int from, int to) {
		return new Incrementer(from, to);
	}
	
	private int from, to, war;

	private Incrementer(int from, int to) {

		this.from = from;
		this.to = to;
		this.war = war;

	}

	public Iterator<Integer> iterator() {
		return new Iterator<Integer>() {
			public boolean hasNext() {
				if (to < 10) {
					return true;
				}else{return false;}
				

			}

			public Integer next(int from) {
				return from++;
								
				// TODO implement
			}

			public void remove() {
				// do nothing
			}

			@Override
			public Integer next() {
				// TODO Auto-generated method stub
				return null;
			}
		};
	}

	public Incrementer by(int war) {
		// TODO implement
		return this;
	}
}

Terza już nic nie podkreśla, ale nie wiem jak mogę stworzyć magiczne to:

1 2 3 4 5 6 7 8 9 10
1 3 5 7 9
10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
1 2 3 4 6 8 10
1 2 3 4 5 6 7 8 6 4 2
10 9 8 7 6 5 6 7 8 9 10

Jakieś sugestie?? :>

0
tsznajder napisał(a)

Jakieś sugestie?? :>

Podziękuj osobie, która umieściła ten kod na peb.pl :-)

0
rkrix napisał(a)
tsznajder napisał(a)

Jakieś sugestie?? :>

Podziękuj osobie, która umieściła ten kod na peb.pl :-)

Masz w 100% rację dziękuje jej za to i chylę przed nia czoła.

0

Dziękuję za wszelką pomoc już sobie poradziłem

1 użytkowników online, w tym zalogowanych: 0, gości: 1