Pomoc z zadaniem "Reversible". Odracanie liczb oraz tekstów

0

Dzień dobry, otóż mam problem z następującym zadaniem:
"Zdefiniować interfejs Reversible z jedną metodą Reversible reverse() i zaimplementować ją w klasach ReversibleString i ReversibleDouble.
Metoda reverse dla Stringów odwraca napis, a dla liczb - odwraca liczbę (czyli z napisu kot robi tok a z liczby 3 robi 0.3333).
Metoda zwraca aktualną (odwróconą) wartość.
Zapewnić by następujący program wykonał się prawidłowo i dał pokazane wyniki:"

 public class ReverseTest {
      
        public static void main(String[] args) {
        
              Reversible[] revers = new Reversible[] {
                  new ReversibleString("Kot"),
                  new ReversibleDouble(2),
                  new ReversibleDouble(3),
                  new ReversibleString("Pies"),
                  new ReversibleString("Ala ma kota i psa"),
                  new ReversibleDouble(10),
              };

              System.out.println("Normalne:");
              for (Reversible r : revers) {
                System.out.println(r);
              }

              for (Reversible r : revers) {
                r.reverse();
              }

              System.out.println("Odwrócone:");
              for (Reversible r : revers) {
                System.out.println(r);
              }

              System.out.println("Przywrócone i zmienione:");
              for (Reversible r : revers) {
                 /*<-  co tu trzeba napisać */
              }
            }
          } 

Za dużo tego zadania nie zrobiłem ponieważ niestety dopiero zaczynam pracę z Javą.
Mam tylko tyle


public interface Reversible {

	void reverse();
	
	
}


public class ReversibleDouble implements Reversible {
	
	private double liczba;

 	public ReversibleDouble(double i) {
		liczba = i;
	}

	@Override
	public void reverse() {
		
	}

	String liczbaTEKST =  Double.toString(liczba);
			
	public String toString() {
        return liczbaTEKST;
    }
	
	
	
}


public class ReversibleString implements Reversible {
	
	public String tekst;

	public ReversibleString(String string) {
		tekst = string;
	}

	@Override
	public void reverse() {
		
		
	}

}  

Mój problem(póki co przynajmniej) to to, że nie wiem co zrobić ale liczby się zapisywały, wyniku powinny wyglądać tak
"Wynik:
Normalne:
Kot
2.0
3.0
Pies
Ala ma kota i psa
10.0
Odwrócone:
toK
0.5
0.3333333333333333
seiP
asp i atok am alA
0.1
Przywrócone i zmienione:
Tekst Kot
12.0
13.0
Tekst Pies
Tekst Ala ma kota i psa
20.0"
Jednak u mnie wszystkie liczby pokazują się jako "0.0"

1

a powiedz mi co Ci robi funkcja reverse tutaj? bo jak dla mnie to nic.

Oprócz tego liczbaTekst jest deklarowana w momencie stworzenia klasy i później niemodyfikowana, więc jak ma cokolwiek zmienić.

proponuję do funkcji reverse dołożyć implementację i zamienić funckję toString.

public class ReversibleDouble implements Reversible {
 
    private double liczba;
 
     public ReversibleDouble(double i) {
        liczba = i;
    }
 
    @Override
    public void reverse() {
            liczba=1/liczba;
    }
 

 
    public String toString() {
        return  Double.toString(liczba);
    }
 
 
 
}

do tego samego ze stringiem masz już wbudowaną metodę klasy String do odwracania, również ją zaimplementuj w metodzie reverse.

Proponuję mocno przysiąść i przeczytać czym jest Interfejs http://docs.oracle.com/javase/tutorial/java/concepts/interface.html
i klasa abstrakcyjna http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

3

A może w ten sposób:

package pl.programmers.reversible;

/**
 * Author: Daniel
 */
public interface Reversible<T> {

    public T reverse(T value);

}
package pl.programmers.reversible;

/**
 * Author: Daniel
 */
public class ReversibleString implements Reversible<String> {

    @Override
    public String reverse(String text) {
        if (text == null) return null;
        StringBuilder sb = new StringBuilder(text);
        return sb.reverse().toString();
    }
}
package pl.programmers.reversible;

/**
 * Author: Daniel
 */
public class ReversibleDouble implements Reversible<Double> {

    @Override
    public Double reverse(Double value) {
        return 1/ value;
    }

}
0

Dziękuje bardzo za pomoc. Powinienem lepiej opisać o co mi chodzi. Wiedziałem jak funkcja reverse ma wyglądać ale kompletnie nie rozumiałem co zrobić aby liczby się wyświetlały prawidłowo. Mógłbyś mi powiedzieć jaka jest różnica między moim

  String liczbaTEKST =  Double.toString(liczba);
 
    public String toString() {
        return liczbaTEKST;

a twoim

 public String toString() {
        return  Double.toString(liczba);
    }
2

W kodzie @bakeraw2 konwertowana jest aktualna wartość pola liczba, w Twoim kodzie konwertowana jest początkowa wartość tego pola (domyślne zero). Dokładniej, inicjacja pola

String liczbaTEKST =  Double.toString(liczba);

zostanie wykonana przed przypisaniemliczba = i;

1

Różnica jest taka że Ty raz tworzysz wartość liczbaTESKT i cokolwiek później zrobisz z liczbą pole liczbaTEKST już nie zmieni swojej wartości i będzie miał wartość domyślną jaką miał w momencie utworzenia.

Jeżeli bardzo chcesz to można to zapisać tak

public String toString() {
        String liczbaTEKST =  Double.toString(liczba);
        return liczbaTEKST;
}

i będzie działało :-)

0

Jeszcze raz dziękuję bardzo za wytłumaczenie. Próbuję teraz odwrócić napisy korzystając z tego co bakeraw2 napisał, ale chce jednak zostawić interfejs Reversible tak jak jest. Chciałbym też zapytać, czy istnieje jakaś możliwość wykorzystania "if" do rozróżnienia Stringa i Double'a? Chodzi mi o trzecią "część" odpowiedzi gdzie mam dodać 10 do liczb i "Tekst" do tekstu

1

funkcja o którą Ci chodzi to instanceof

1

Jeśli chcesz zachować funkcję

void reverse()

to się mocno nagimnastykujesz, żeby program wyświetlał to co trzeba. Jeśli kod, który podał @bakeraw2 jest dla Ciebie zbyt wymyślny, to zastosuj taki:
public interface Reversible {
Object reverse();
}

0

Nie jest wymyślny, nawet rozumiem poniekąd jak działa ale z tego co mi wiadomo w zadaniu ma pozostać zywkłe "void reversible();" żeby zadanie było uznane za zrobione dobrze

1

To robisz tak samo tylko usuwasz parametry generyczne z interfejsu i piszesz jak napisał @wojciechmaciejewski i już.

0

@bakeraw2 Czyli coś takiego?

public void reverse() {
		StringBuilder sb = new StringBuilder(tekst);
		sb.reverse().toString();
	}

A odnośnie instanceof napisałem tak

System.out.println("Przywrócone i zmienione:");
        for (Reversible r : revers) {
        	r.reverse();
        	if(r instanceof ReversibleDouble){
        		r + 10;
        	}else{
        		"Tekst" + r;
        	}
        	System.out.println(r);

Coś w ten deseń?

0
Kagineko napisał(a):

Nie jest wymyślny, nawet rozumiem poniekąd jak działa ale z tego co mi wiadomo w zadaniu ma pozostać zywkłe "void reversible();" żeby zadanie było uznane za zrobione dobrze

A to cytat z pierwszego posta:

Metoda zwraca aktualną (odwróconą) wartość.

To ma zwracać czy nie? Lepiej się upewnij bo mi z tym void kompletnie nie pasuje

0

Sam chciał bym to wiedzieć, według wykładowcy ma zostać void reverse()

1

Napisz tak jak napisał wcześniej @bakeraw2 z generykami, tylko zmień funkcję na void. Dopisz sobię dodatkową metodę tostring czy pobierz czy jak tam sobie chcesz zresztą dokładnie tak jak zrobiłeś wcześniej i sprawa załatwiona. instanceof nie musisz używać a metoda zwraca void

0
wojciechmaciejewski napisał(a):

Napisz tak jak napisał wcześniej @bakeraw2 z generykami, tylko zmień funkcję na void. Dopisz sobię dodatkową metodę tostring czy pobierz czy jak tam sobie chcesz zresztą dokładnie tak jak zrobiłeś wcześniej i sprawa załatwiona. instanceof nie musisz używać a metoda zwraca void

No wybacz ale nie rozumiem co sugerujesz, z "generykami"(czyli "(T value);"?) nie mogę napisać bo reverse() mam zostawic tak jak jest. A jeżeli nie muszę używać instanceof to jak mam zmienić te wyniki?

0

Wykorzystam kod @bakeraw2 trochę może się nie obrazi :P

package pl.programmers.reversible;
 
/**
 * Author: Daniel
 */
public class ReversibleString implements Reversible<String> {
    private String zmienna;
    @Override
    public void reverse(String text) {
        if (text == null) return null;
        StringBuilder sb = new StringBuilder(text);
        zmienna=sb.reverse().toString();
    }

    public String podaj_zmienna(){return zmienna;}

}

analogicznie dla Doubli tworzysz.

Dodajesz kolekcje Reversible

   ArrayList<Reversible> revers = new ArrayList();
                  revers .add(new ReversibleString("Kot"));
                  revers .add( new ReversibleDouble(2);
              
for(Reversible res:revers){
res.reverse();
System.out.println(res.podaj_zmienna());

}

proszę bardzo odpowiedź na tacy

0
wojciechmaciejewski napisał(a):

Wykorzystam kod @bakeraw2 trochę może się nie obrazi :P

package pl.programmers.reversible;
 
/**
 * Author: Daniel
 */
public class ReversibleString implements Reversible<String> {
    private String zmienna;
    @Override
    public void reverse(String text) {
        if (text == null) return null;
        StringBuilder sb = new StringBuilder(text);
        zmienna=sb.reverse().toString();
    }

    public String podaj_zmienna(){return zmienna;}

}

analogicznie dla Doubli tworzysz.

Dodajesz kolekcje Reversible

   ArrayList<Reversible> revers = new ArrayList();
                  revers .add(new ReversibleString("Kot"));
                  revers .add( new ReversibleDouble(2);
              
for(Reversible res:revers){
res.reverse();
System.out.println(res.podaj_zmienna());

}

proszę bardzo odpowiedź na tacy

Głupio mi się teraz zapytać skoro odpowiedź "na tacy" ale co to ma być? Po co ArrayList(Jeżeli do klasy RverseTest to nie mogę tego użyć ponieważ jedyne zmiany jakie mogę wprowadzić w tej klasie mają się znajdować pod "System.out.println("Przywrócone i zmienione:");")? A generyków NIE MOGĘ używać

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