kristina7

НП - Лаб 4-3 Листа на цели броеви

Jan 3rd, 2019
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.93 KB | None | 0 0
  1. /*
  2. Со користење на ArrayList или LinkedList сакаме да развиеме класа за работа со листи од цели броеви IntegerList. Листата ги има следните вообичаени методи:
  3.  
  4. IntegerList() - конструктор кој креира празна листа.
  5. IntegerList(Integer… numbers) - конструктор коj креира листа што ги содржи елементите numbers во истиот редослед во кој тие се појавуваат во низата.
  6. add(int el, int idx) - го додава елементот на соодветниот индекс. Доколку има други елементи после таа позиција истите се поместуваат на десно за едно место (нивните индекси им се зголемуваат за 1). Доколку idx е поголемо од сегашната големина на листата ја зголемуваме листата и сите нови елементи ги иницијалираме на нула (освен тој на позиција idx кој го поставуваме на el).
  7. remove(int idx):int - го отстранува елементот на дадена позиција од листата и истиот го враќа. Доколку после таа позиција има други елементи истите се поместуваат во лево (нивните индекси се намалуваат за 1).
  8. set(int el, int idx) - го поставува елементот на соодветната позиција.
  9. get(int idx):int - го враќа елементот на соодветната позиција.
  10. size():int - го враќа бројот на елементи во листата.
  11. Освен овие методи IntegerList треба да нуди и неколку методи згодни за работа со цели броеви:
  12.  
  13. count(int el):int - го враќа бројот на појавувања на соодветниот елемент во листата.
  14. removeDuplicates() - врши отстранување на дупликат елементите од листата. Доколку некој елемент се сретнува повеќе пати во листата ја оставаме само последната копија од него. Пр: 1,2,4,3,4,5. -> removeDuplicates() -> 1,2,3,4,5
  15. sumFirst(int k):int - ја дава сумата на првите k елементи.
  16. sumLast(int k):int - ја дава сумата на последните k елементи.
  17. shiftRight(int idx, int k) - го поместува елементот на позиција idx за k места во десно. При поместувањето листата ја третираме како да е кружна. Пр: list = [1,2,3,4]; list.shiftLeft(1,2); list = [1,3,4,2] - (листата е нула индексирана така да индексот 1 всушност се однесува на елементот 2 кој го поместуваме две места во десно) list = [1,2,3,4]; list.shiftLeft(2, 3); list = [1,3,2,4] - елементот 3 го поместуваме 3 места во десно. По две поместувања стигнуваме до крајот на листата и потоа продолжуваме да итерираме од почетокот на листата уште едно место и овде го сместуваме.
  18. shiftLeft(int idx , int k) - аналогно на shiftRight.
  19. addValue(int value):IntegerList - враќа нова листа каде елементите се добиваат од оригиналната листа со додавање на value на секој елемент. Пр: list = [1,4,3]; addValue(5) -> [6,9,8]
  20. Забелешка која важи за сите методи освен add: Ако индексот е негативен или поголем од тековната големина на листата фрламе исклучок ArrayIndexOutOfBoundsException.
  21. */
  22.  
  23. import java.util.ArrayList;
  24. import java.util.Collections;
  25. import java.util.Comparator;
  26. import java.util.List;
  27. import java.util.Scanner;
  28. import java.util.stream.Collectors;
  29. import java.util.stream.IntStream;
  30.  
  31. class IntegerList {
  32.     List<Integer> integers;
  33.  
  34.     public IntegerList() {
  35.         integers = new ArrayList<>();
  36.     }
  37.  
  38.     public IntegerList(Integer... numbers) {
  39.         this();
  40.         for (Integer integer : numbers)
  41.             integers.add(integer);
  42.     }
  43.  
  44.     public void add(int el, int idx) {
  45.         if (idx > size())
  46.             IntStream.range(size(), idx).forEach(i -> integers.add(0));
  47.  
  48.         integers.add(idx, el);
  49.     }
  50.  
  51.     public int remove(int idx) {
  52.         return integers.remove(idx);
  53.     }
  54.  
  55.     public void set(int el, int idx) {
  56.         integers.set(idx, el);
  57.     }
  58.  
  59.     public int get(int idx) {
  60.         return integers.get(idx);
  61.     }
  62.  
  63.     public int size() {
  64.         return integers.size();
  65.     }
  66.  
  67.     public int count(int el) {
  68.         return (int) integers.stream().filter(i -> i.intValue() == el).count();
  69.     }
  70.  
  71.     public void removeDuplicates() {
  72.         Collections.reverse(integers);
  73.         integers = integers.stream().distinct().collect(Collectors.toList());
  74.         Collections.reverse(integers);
  75.     }
  76.  
  77.     public int sumFirst(int k) {
  78.         if (k > size()) k = size();
  79.         return integers.subList(0, k).stream().reduce(Integer::sum).orElse(0);
  80.     }
  81.  
  82.     public int sumLast(int k) {
  83.         if(k > size()) k = 0;
  84.         return integers.subList(size() - k, size()).stream().reduce(Integer::sum).orElse(0);
  85.     }
  86.  
  87.     public void shiftRight(int idx, int k) {
  88.         int newIndex = (idx + k) % size();
  89.         Integer el = integers.remove(idx);
  90.         integers.add(newIndex, el);
  91.     }
  92.  
  93.     public void shiftLeft(int idx, int k) {
  94.         int newIndex = idx - (k % size());
  95.         if (newIndex < 0)
  96.             newIndex += size();
  97.         Integer el = integers.remove(idx);
  98.         integers.add(newIndex, el);
  99.     }
  100.  
  101.     public IntegerList addValue(int value) {
  102.         IntegerList result = new IntegerList();
  103.         integers.forEach(i -> result.add(i + value, integers.indexOf(i)));
  104.         return result;
  105.     }
  106. }
  107.  
  108. public class IntegerListTest {
  109.  
  110.     public static void main(String[] args) {
  111.         Scanner jin = new Scanner(System.in);
  112.         int k = jin.nextInt();
  113.         if (k == 0) { // test standard methods
  114.             int subtest = jin.nextInt();
  115.             if (subtest == 0) {
  116.                 IntegerList list = new IntegerList();
  117.                 while (true) {
  118.                     int num = jin.nextInt();
  119.                     if (num == 0) {
  120.                         list.add(jin.nextInt(), jin.nextInt());
  121.                     }
  122.                     if (num == 1) {
  123.                         list.remove(jin.nextInt());
  124.                     }
  125.                     if (num == 2) {
  126.                         print(list);
  127.                     }
  128.                     if (num == 3) {
  129.                         break;
  130.                     }
  131.                 }
  132.             }
  133.             if (subtest == 1) {
  134.                 int n = jin.nextInt();
  135.                 Integer a[] = new Integer[n];
  136.                 for (int i = 0; i < n; ++i) {
  137.                     a[i] = jin.nextInt();
  138.                 }
  139.                 IntegerList list = new IntegerList(a);
  140.                 print(list);
  141.             }
  142.         }
  143.         if (k == 1) { // test count,remove duplicates, addValue
  144.             int n = jin.nextInt();
  145.             Integer a[] = new Integer[n];
  146.             for (int i = 0; i < n; ++i) {
  147.                 a[i] = jin.nextInt();
  148.             }
  149.             IntegerList list = new IntegerList(a);
  150.             while (true) {
  151.                 int num = jin.nextInt();
  152.                 if (num == 0) { // count
  153.                     System.out.println(list.count(jin.nextInt()));
  154.                 }
  155.                 if (num == 1) {
  156.                     list.removeDuplicates();
  157.                 }
  158.                 if (num == 2) {
  159.                     print(list.addValue(jin.nextInt()));
  160.                 }
  161.                 if (num == 3) {
  162.                     list.add(jin.nextInt(), jin.nextInt());
  163.                 }
  164.                 if (num == 4) {
  165.                     print(list);
  166.                 }
  167.                 if (num == 5) {
  168.                     break;
  169.                 }
  170.             }
  171.         }
  172.         if (k == 2) { // test shiftRight, shiftLeft, sumFirst , sumLast
  173.             int n = jin.nextInt();
  174.             Integer a[] = new Integer[n];
  175.             for (int i = 0; i < n; ++i) {
  176.                 a[i] = jin.nextInt();
  177.             }
  178.             IntegerList list = new IntegerList(a);
  179.             while (true) {
  180.                 int num = jin.nextInt();
  181.                 if (num == 0) { // count
  182.                     list.shiftLeft(jin.nextInt(), jin.nextInt());
  183.                 }
  184.                 if (num == 1) {
  185.                     list.shiftRight(jin.nextInt(), jin.nextInt());
  186.                 }
  187.                 if (num == 2) {
  188.                     System.out.println(list.sumFirst(jin.nextInt()));
  189.                 }
  190.                 if (num == 3) {
  191.                     System.out.println(list.sumLast(jin.nextInt()));
  192.                 }
  193.                 if (num == 4) {
  194.                     print(list);
  195.                 }
  196.                 if (num == 5) {
  197.                     break;
  198.                 }
  199.             }
  200.         }
  201.     }
  202.  
  203.     public static void print(IntegerList il) {
  204.         if (il.size() == 0)
  205.             System.out.print("EMPTY");
  206.         for (int i = 0; i < il.size(); ++i) {
  207.             if (i > 0)
  208.                 System.out.print(" ");
  209.             System.out.print(il.get(i));
  210.         }
  211.         System.out.println();
  212.     }
  213.  
  214. }
Advertisement
Add Comment
Please, Sign In to add comment