Advertisement
SashkoKlincharov

[Java][НП] - Генерички контејнер со променлива должина

Aug 26th, 2021
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.76 KB | None | 0 0
  1.  
  2.  
  3. Да се напише класа ResizableArray која ќе претставува поле (низа) со променлива должина. Класата може да чува елементи од било кој тип (треба да биде генеричка со еден параметар T) и треба да ги има дефинирано следните методи:
  4.  
  5. ResizableArray() - креира ново празно поле
  6. addElement(T element) - додава нов елемент во полето (доколку нема доволно место го зголемува капацитетот на полето).
  7. removeElement(T element):boolean - aко постои таков елемент истиот го брише и враќа true, во спротивно враќа false, доколку има повеќе инстанци од дадениот елемент се брише само една од нив (ако има многу празно место во полето го намалува неговиот капацитет)
  8. contains(T element):boolean - враќа true доколку во полето постои дадениот елемент
  9. toArray():Object[] - ги враќа сите елементи во полето како обична низа
  10. isEmpty() - враќа true доколку во полето нема ниеден елемент
  11. count():int - го браќа бројот на елементи во полето
  12. elementAt(int idx):T - го враќа елементот на соодветната позиција, доколку нема таков фрла исклучок ArrayIndexOutOfBoundsException (елементите во полето се наоѓаат на позиции [0, count()])
  13.  
  14. Забелешка: за чување на елементите мора да се користи обична низа Т[] elements, не смее да се користи ArrayList<T> и истата мора да биде декларирана како private.
  15.  
  16. Дополнително, класата ResizableArray треба да има еден статички метод:
  17.  
  18. <T> void copyAll(ResizableArray<? super T> dest, ResizableArray<? extends T> src)
  19.  
  20. Овој метод треба да изврши копирање на сите елементи од src во dest (src останува непроменета, dest ги содржи сите елементи кои ги имал од порано и дополнително сите елементи кои ги има во src).
  21.  
  22. Следно треба да се напише класа IntegerArray која наследува од класата ResizableArray IntegerArray extends ResizableArray<Integer> и служи за чување на цели броеви. Оваа класа ги нуди следниве методи:
  23.  
  24. sum():double - ја враќа сумата на сите елементи во полето
  25. mean():double - го дава просекот на сите елементи во полето
  26. countNonZero():int - го дава бројот на елементи во полето кои имаат вредност различна од нула
  27. distinct():IntegerArray - враќа нов објект кој во себе ги содржи истите елементи кои ги содржи this, но нема дупликат елементи
  28. increment(int offset):IntegerArray - враќа нов објект кој во себе ги содржи сите елемeнти кои ги содржи this, но на нив додавајќи offset
  29.  
  30.  
  31.  
  32. import java.util.*;
  33.  
  34. class ResizableArray<T> {
  35. private int count;
  36. private T [] elements;
  37. private int size;
  38.  
  39. public ResizableArray() {
  40. elements = (T[]) new Object[10];
  41. count = 0;
  42. size = 10;
  43. }
  44.  
  45.  
  46. public void addElement(T element){
  47. if(size==count){
  48. size = size * 2;
  49. T[] temp = (T[]) new Object[size];
  50. for (int i = 0; i < elements.length; i++) {
  51. temp[i] = elements[i];
  52. }
  53. elements = temp;
  54. }
  55. elements[count++] = element;
  56. }
  57. public boolean removeElement(T element){
  58. int index = this.findElement(element);
  59. if (index == -1)
  60. return false;
  61. for (int i=index; i<count-1;++i) {
  62. elements[i] = elements[i+1];
  63. }
  64. --count;
  65. return true;
  66. }
  67.  
  68. private int findElement(T element) {
  69. for (int i = 0; i < count; i++) {
  70. if(element.equals(elements[i]))
  71. return i;
  72. }
  73. return -1;
  74. }
  75.  
  76. boolean contains(T element){
  77. return this.findElement(element) != -1;
  78. }
  79.  
  80. Object[] toArray(){
  81. return Arrays.stream(elements).toArray();
  82. }
  83.  
  84. boolean isEmpty(){
  85. return count ==0;
  86. }
  87. public int count(){
  88. return count;
  89. }
  90.  
  91. public T elementAt(int idx){
  92. if(idx >= 0&&idx < count())
  93. return elements[idx];
  94. else throw new ArrayIndexOutOfBoundsException();
  95. }
  96.  
  97. public static <T> void copyAll(ResizableArray<? super T> dest, ResizableArray<? extends T> src){
  98. for (int i = 0; i < src.count; i++) {
  99. dest.addElement(src.elementAt(i));
  100. }
  101. }
  102. }
  103.  
  104. class IntegerArray extends ResizableArray<Integer> {
  105.  
  106. public IntegerArray() {
  107. super();
  108. }
  109. public double sum(){
  110. double sum = 0.0;
  111. for (int i = 0; i < count(); i++) {
  112. sum+=elementAt(i);
  113. }
  114. return sum;
  115. }
  116.  
  117. public double mean(){
  118. return sum()/count();
  119. }
  120. public int countNonZero(){
  121. int brojNenuli = 0;
  122. for (int i = 0; i < count(); i++) {
  123. if(elementAt(i) != 0)
  124. brojNenuli++;
  125. }
  126. return brojNenuli;
  127. }
  128.  
  129. public IntegerArray distinct(){
  130. IntegerArray ia = new IntegerArray();
  131. for (int i = 0; i < count(); i++) {
  132. if(ia.contains(this.elementAt(i)))
  133. continue;
  134. ia.addElement(this.elementAt(i));
  135. }
  136. return ia;
  137. }
  138.  
  139. public IntegerArray increment(int offset){
  140. IntegerArray nova = new IntegerArray();
  141. for (int i = 0; i < count(); i++) {
  142. nova.addElement(this.elementAt(i) + offset);
  143. }
  144. return nova;
  145. }
  146. }
  147.  
  148. public class ResizableArrayTest {
  149.  
  150. public static void main(String[] args) {
  151. Scanner jin = new Scanner(System.in);
  152. int test = jin.nextInt();
  153. if ( test == 0 ) { //test ResizableArray on ints
  154. ResizableArray<Integer> a = new ResizableArray<Integer>();
  155. System.out.println(a.count());
  156. int first = jin.nextInt();
  157. a.addElement(first);
  158. System.out.println(a.count());
  159. int last = first;
  160. while ( jin.hasNextInt() ) {
  161. last = jin.nextInt();
  162. a.addElement(last);
  163. }
  164. System.out.println(a.count());
  165. System.out.println(a.contains(first));
  166. System.out.println(a.contains(last));
  167. System.out.println(a.removeElement(first));
  168. System.out.println(a.contains(first));
  169. System.out.println(a.count());
  170. }
  171. if ( test == 1 ) { //test ResizableArray on strings
  172. ResizableArray<String> a = new ResizableArray<String>();
  173. System.out.println(a.count());
  174. String first = jin.next();
  175. a.addElement(first);
  176. System.out.println(a.count());
  177. String last = first;
  178. for ( int i = 0 ; i < 4 ; ++i ) {
  179. last = jin.next();
  180. a.addElement(last);
  181. }
  182. System.out.println(a.count());
  183. System.out.println(a.contains(first));
  184. System.out.println(a.contains(last));
  185. System.out.println(a.removeElement(first));
  186. System.out.println(a.contains(first));
  187. System.out.println(a.count());
  188. ResizableArray<String> b = new ResizableArray<String>();
  189. ResizableArray.copyAll(b, a);
  190. System.out.println(b.count());
  191. System.out.println(a.count());
  192. System.out.println(a.contains(first));
  193. System.out.println(a.contains(last));
  194. System.out.println(b.contains(first));
  195. System.out.println(b.contains(last));
  196. ResizableArray.copyAll(b, a);
  197. System.out.println(b.count());
  198. System.out.println(a.count());
  199. System.out.println(a.contains(first));
  200. System.out.println(a.contains(last));
  201. System.out.println(b.contains(first));
  202. System.out.println(b.contains(last));
  203. System.out.println(b.removeElement(first));
  204. System.out.println(b.contains(first));
  205. System.out.println(b.removeElement(first));
  206. System.out.println(b.contains(first));
  207.  
  208. System.out.println(a.removeElement(first));
  209. ResizableArray.copyAll(b, a);
  210. System.out.println(b.count());
  211. System.out.println(a.count());
  212. System.out.println(a.contains(first));
  213. System.out.println(a.contains(last));
  214. System.out.println(b.contains(first));
  215. System.out.println(b.contains(last));
  216. }
  217. if ( test == 2 ) { //test IntegerArray
  218. IntegerArray a = new IntegerArray();
  219. System.out.println(a.isEmpty());
  220. while ( jin.hasNextInt() ) {
  221. a.addElement(jin.nextInt());
  222. }
  223. jin.next();
  224. System.out.println(a.sum());
  225. System.out.println(a.mean());
  226. System.out.println(a.countNonZero());
  227. System.out.println(a.count());
  228. IntegerArray b = a.distinct();
  229. System.out.println(b.sum());
  230. IntegerArray c = a.increment(5);
  231. System.out.println(c.sum());
  232. if ( a.sum() > 100 )
  233. ResizableArray.copyAll(a, a);
  234. else
  235. ResizableArray.copyAll(a, b);
  236. System.out.println(a.sum());
  237. System.out.println(a.removeElement(jin.nextInt()));
  238. System.out.println(a.sum());
  239. System.out.println(a.removeElement(jin.nextInt()));
  240. System.out.println(a.sum());
  241. System.out.println(a.removeElement(jin.nextInt()));
  242. System.out.println(a.sum());
  243. System.out.println(a.contains(jin.nextInt()));
  244. System.out.println(a.contains(jin.nextInt()));
  245. }
  246. if ( test == 3 ) { //test insanely large arrays
  247. LinkedList<ResizableArray<Integer>> resizable_arrays = new LinkedList<ResizableArray<Integer>>();
  248. for ( int w = 0 ; w < 500 ; ++w ) {
  249. ResizableArray<Integer> a = new ResizableArray<Integer>();
  250. int k = 2000;
  251. int t = 1000;
  252. for ( int i = 0 ; i < k ; ++i ) {
  253. a.addElement(i);
  254. }
  255.  
  256. a.removeElement(0);
  257. for ( int i = 0 ; i < t ; ++i ) {
  258. a.removeElement(k-i-1);
  259. }
  260. resizable_arrays.add(a);
  261. }
  262. System.out.println("You implementation finished in less then 3 seconds, well done!");
  263. }
  264. }
  265.  
  266. }
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274. 2
  275. 1 2 3 -2 -5 0
  276. a
  277. 1 -1 1 1 -1 0
  278.  
  279.  
  280. Size: 109
  281.  
  282. true
  283. -1.0
  284. -0.16666666666666666
  285. 5
  286. 6
  287. -1.0
  288. 29.0
  289. -2.0
  290. true
  291. -3.0
  292. false
  293. -3.0
  294. true
  295. -4.0
  296. false
  297. false
  298.  
  299.  
  300. Size: 93
  301.  
  302. true
  303. -1.0
  304. -0.16666666666666666
  305. 5
  306. 6
  307. -1.0
  308. 29.0
  309. -2.0
  310. true
  311. -3.0
  312. false
  313. -3.0
  314. true
  315. -4.0
  316. false
  317. false
  318.  
  319.  
  320.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement