ConsListImpl.java 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package migl.util;
  2. import java.util.Iterator;
  3. import java.util.function.Function;
  4. public class ConsListImpl<E> extends Cons<E, ConsList<E>> implements ConsList<E>{
  5. private final int size;
  6. public ConsListImpl(E left, ConsList<E> right) {
  7. super(left, right);
  8. this.size = 1 + right.size();
  9. }
  10. @Override
  11. public Iterator<E> iterator() {
  12. return new Iterator<E>() {
  13. private ConsList<E> current = ConsListImpl.this;
  14. @Override
  15. public boolean hasNext() {
  16. return !current.isEmpty();
  17. }
  18. @Override
  19. public E next() {
  20. E e = current.car();
  21. current = current.cdr();
  22. return e;
  23. }
  24. };
  25. }
  26. @Override
  27. public ConsList<E> prepend(E e) {
  28. return new ConsListImpl<>(e, this);
  29. }
  30. @Override
  31. public ConsList<E> append(E e) {
  32. return appendRec(e, this);
  33. }
  34. private ConsList<E> appendRec(E e, ConsList<E> list) {
  35. if(list.isEmpty()) {
  36. return new ConsListImpl<>(e, list);
  37. }
  38. return new ConsListImpl<>(list.car(), this.appendRec(e, list.cdr()));
  39. }
  40. @Override
  41. public boolean isEmpty() {
  42. return this.size == 0;
  43. }
  44. @Override
  45. public E car() {
  46. return this.left();
  47. }
  48. @Override
  49. public ConsList<E> cdr() {
  50. return this.right();
  51. }
  52. @Override
  53. public int size() {
  54. return this.size;
  55. }
  56. @Override
  57. public <T> ConsList<T> map(Function<E, T> f) {
  58. ConsList<T> result = new ConsEmptyList<>();
  59. for(E e : this) {
  60. result = result.append(f.apply(e));
  61. }
  62. return result;
  63. /*
  64. //Version avec prepend
  65. ConsList<E> list[] = new ConsList[this.size];
  66. //Recuperation des elements de la liste
  67. ConsList<E> actual = this;
  68. for(int i = 0; i < this.size; i++) {
  69. list[i] = actual;
  70. actual = actual.cdr();
  71. }
  72. //Creation nouvelle liste
  73. ConsList<T> result = new ConsEmptyList<>();
  74. for(int i = this.size - 1; i > -1; i--) {
  75. result = result.prepend(f.apply(list[i].car()));
  76. }
  77. return result;
  78. //*/
  79. }
  80. @Override
  81. public String toString() {
  82. String str = "(";
  83. for(E e : this) {
  84. if(e == null) {
  85. str += "null ";
  86. } else {
  87. str += e.toString() + " ";
  88. }
  89. }
  90. return str.trim() + ")";
  91. }
  92. @Override
  93. public int hashCode() {
  94. //Hascode de cons suffisant
  95. return super.hashCode();
  96. }
  97. @Override
  98. public boolean equals(Object obj) {
  99. //Equals de cons suffisant
  100. return super.equals(obj);
  101. }
  102. }