Naloga/Programiranje/Objektno programiranje/Razred Seznam/Rešitev (Java)

Iz MaFiRaWiki

Ta članek ali del članka je v delu. Veseli bomo, če ga boste dopolnili in popravili.

Kaj pomeni to opozorilo?

  1. public class Seznam<T> {
  2. boolean prazen; // ==true, ce je seznam prazen
  3. T glava; //==null, ce je seznam prazen
  4. Seznam<T> rep;
  5. // konstruktorja
  6. public Seznam() {
  7. this.prazen = true;
  8. this.glava = null;
  9. this.rep = null;
  10. }
  11. public Seznam(T g, Seznam<T> r) {
  12. this.prazen = false;
  13. this.glava = g;
  14. this.rep = r;
  15. }
  16. public String toString() {
  17. String r = "[";
  18. // v r dodajamo (predstavitve) elementov seznama
  19. Seznam<T> s = this;
  20. while (!s.prazen) {
  21. r = r + s.glava; // v niz r dodaj predstavitev glave
  22. if (!s.rep.prazen) { r = r + ", "; }
  23. s = s.rep; // pomakni se naprej v seznamu
  24. }
  25. r = r + "]";
  26. return r;
  27. }
  28. // vrni dolzino seznama
  29. public int dolzina() {
  30. int k = 0;
  31. Seznam<T> s = this;
  32. // se peljemo cez seznam
  33. while (!s.prazen) {
  34. k++;
  35. s = s.rep;
  36. }
  37. return k;
  38. }
  39. // vrni dolzino seznama
  40. public int dolzina2() {
  41. if (this.prazen) {
  42. return 0;
  43. }
  44. else {
  45. return 1 + this.rep.dolzina2();
  46. }
  47. }
  48. // vrni dolzino seznama
  49. // spomnimo se: "p ? a : b" pomeni "ce velja p potem a sicer b"
  50. public int dolzina3() {
  51. return (this.prazen ? 0 : 1 + this.rep.dolzina3());
  52. }
  53. }

  1.  
  2. //metoda stakni, ki sprejme seznam s in vrne nov seznam, ki je stik seznamov this in s
  3. public Seznam <T> stakni(Seznam <T> s){
  4. if (s.prazen) return this;
  5. if (prazen) return s;
  6.  
  7. Seznam <T> t = this;
  8. while (!t.rep.prazen) t = t.rep;
  9. t.rep = s;
  10.  
  11. return this;
  12. }
  13.  
  14. //metoda pritakni, ki sprejme seznam s in ga doda na konec seznama this
  15. public void pritakni(Seznam <T> s){
  16. if (s.prazen) return;
  17. if (prazen) {
  18. prazen = s.prazen;
  19. glava = s.glava;
  20. rep = s.rep;
  21. }
  22. Seznam <T> t = this;
  23. while (!t.rep.prazen) t = t.rep;
  24. t.rep = s;
  25. }
  26.  
  27. //se ena metoda za stakni
  28. public Seznam <T> stik(Seznam <T> s){
  29. Seznam <T> t = new Seznam<T>();
  30. Seznam <T> k = t;
  31. for (Seznam <T> p = this; !p.prazen; p = p.rep){
  32. if (t.prazen) k = t = new Seznam <T> (p.glava, t);
  33. else k = k.rep = new Seznam <T> (p.glava, k.rep);
  34. }
  35. for (Seznam <T> q = s; !q.prazen; q = q.rep){
  36. if (!t.prazen) k = t = new Seznam <T> (q.glava, t);
  37. else k = k.rep = new Seznam <T> (q.glava, k.rep);
  38. }
  39. return t;
  40. }
  41.  
  42. //metoda vstavi, ki sprejme element x in ga vstavi na začetek seznama this
  43. public Seznam <T> vstavi(T x){
  44. Seznam<T> s = this;
  45. Seznam<T> t = new Seznam<T>(x, s);
  46. return t;
  47. }
  48. //zbrisiGlavo, ki s seznama odstrani glavo.
  49. public void zbrisiGlavo(){
  50. this.glava = this.rep.glava;
  51. this.rep = this.rep.rep;
  52. }
  53. //element, ki sprejme nenegativno celo stevilo k in vrne k-ti element seznama (začetni element ima indeks k = 0).
  54. public T elementAt(int k){
  55. for (Seznam<T> s = this; !s.prazen; s = s.rep){
  56. //zmanjšamo k
  57. --k;
  58. if (k == 0) return s.glava;
  59. }
  60. return null;
  61. }

Primeri uporabe (narejeno v Drjava):

 
> Seznam a = new Seznam("foo", new Seznam("bar", new Seznam ("baz", new Seznam("fooo", new Seznam()))));
> a.toString()
"[foo, bar, baz, fooo]"
> Seznam b = new Seznam("foo", new Seznam("bar", new Seznam ()));
> b.toString()
"[foo, bar]"
 
Seznam c = a.stakni(b)
> c.toString()
"[foo, bar, baz, fooo, foo, bar]"
 
a.pritakni(b)
> a.toString()
"[foo, bar, baz, fooo, foo, bar]"
 
> c.vstavi("bla")
[bla, foo, bar, baz, fooo, foo, bar]
 
> c.zbrisiGlavo()
> c.toString()
"[bar, baz, fooo, foo, bar]"
 
> c.elementAt(3)
"fooo"
Osebna orodja