Advertisement
silvi81

Array Manipulator

Nov 28th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.31 KB | None | 0 0
  1. package com.scaleFocus;
  2.  
  3. import java.util.*;
  4. import java.util.function.Predicate;
  5.  
  6. public class ArrayManipulator {
  7.  
  8.     static int[] numbers;
  9.     static Predicate<Integer> oddOrEvenTester;
  10.  
  11.     public static void main(String[] args) {
  12.         Scanner scanner = new Scanner(System.in);
  13.  
  14.         numbers = Arrays.stream(scanner.nextLine().split("\\s+"))
  15.                 .mapToInt(s -> Integer.parseInt(s))
  16.                 .toArray();
  17.  
  18.         String commands = scanner.nextLine();
  19.  
  20.         while (!commands.equals("end")) {
  21.             String [] commandArgs = commands.split("\\s+");
  22.             String command = commandArgs[0];
  23.  
  24.             switch (command){
  25.                 case "exchange":
  26.                     int index= Integer.parseInt(commandArgs[1]);
  27.  
  28.                     if(isInRange(index)){
  29.                         if (index != numbers.length - 1){
  30.                             numbers = exchange(index);
  31.                         }
  32.                     }else{
  33.                         System.out.println("Invalid index");
  34.                     }
  35.                     break;
  36.                 case "max":
  37.                     String oddEven = commandArgs[1];
  38.                     int indexOfMaxOddEven = -1;
  39.  
  40.                     oddOrEvenTester = createOddOrEvenTester(oddEven);
  41.                     indexOfMaxOddEven = findMaxOddOrEvenIndex(oddOrEvenTester);
  42.  
  43.                     printIndex(indexOfMaxOddEven);
  44.                     break;
  45.                 case "min":
  46.                     String oddOrEven = commandArgs[1];
  47.                     int indexOfMinOddOrEven = -1;
  48.  
  49.                     oddOrEvenTester = createOddOrEvenTester(oddOrEven);
  50.                     indexOfMinOddOrEven = findMinOddOrEvenIndex(oddOrEvenTester);
  51.  
  52.                     printIndex(indexOfMinOddOrEven);
  53.                     break;
  54.                 case "first":
  55.                     int count= Integer.parseInt(commandArgs[1]);
  56.  
  57.                     if (count > numbers.length){
  58.                         System.out.println("Invalid count");
  59.                     }else{
  60.                         String evenOdd= commandArgs[2];
  61.                         oddOrEvenTester = createOddOrEvenTester(evenOdd);
  62.                         List<Integer> firstOddEven = findFirstOddEven(count, oddOrEvenTester);
  63.                         System.out.println(firstOddEven.toString());
  64.                     }
  65.                     break;
  66.                 case "last":
  67.                     int countOfOddEven= Integer.parseInt(commandArgs[1]);
  68.  
  69.                     if (countOfOddEven > numbers.length){
  70.                         System.out.println("Invalid count");
  71.                     }else{
  72.                         String evenOrOdd= commandArgs[2];
  73.                         oddOrEvenTester = createOddOrEvenTester(evenOrOdd);
  74.                         Deque<Integer> lastOddEven = findLastOddEven(countOfOddEven, oddOrEvenTester);
  75.                         System.out.println(lastOddEven);
  76.                     }
  77.                     break;
  78.             }
  79.  
  80.             commands = scanner.nextLine();
  81.         }
  82.  
  83.         System.out.println(Arrays.toString(numbers));
  84.     }
  85.  
  86.     private static void printIndex(int indexOfMinOddOrEven) {
  87.         if (indexOfMinOddOrEven == -1) {
  88.             System.out.println("No matches");
  89.         } else {
  90.             System.out.println(indexOfMinOddOrEven);
  91.         }
  92.     }
  93.  
  94.     private static int findMinOddOrEvenIndex(Predicate<Integer> oddOrEvenTester) {
  95.         int index = -1;
  96.         int minOddNumber = Integer.MAX_VALUE;
  97.  
  98.         for (int i = numbers.length - 1; i >= 0 ; i--) {
  99.             int number = numbers[i];
  100.  
  101.             if (oddOrEvenTester.test(number)){
  102.                 if (number < minOddNumber){
  103.                     index = i;
  104.                     minOddNumber = number;
  105.                 }
  106.             }
  107.         }
  108.  
  109.         return index;
  110.     }
  111.  
  112.     private static boolean isInRange(int index) {
  113.         return index>= 0 && index < numbers.length;
  114.     }
  115.  
  116.     private static Deque<Integer> findLastOddEven(int count, Predicate<Integer> oddOrEvenTester) {
  117.         Deque<Integer> result = new LinkedList<>();
  118.  
  119.         int resultIndex = 0;
  120.  
  121.         for (int i = numbers.length - 1; i >= 0 ; i--) {
  122.             int number = numbers[i];
  123.  
  124.             if (oddOrEvenTester.test(number)){
  125.                 result.addFirst(number);
  126.                 resultIndex++;
  127.             }
  128.  
  129.             if (resultIndex >= count){
  130.                 break;
  131.             }
  132.         }
  133.  
  134.         return result;
  135.     }
  136.  
  137.     private static List<Integer> findFirstOddEven(int count, Predicate<Integer> oddOrEvenTester) {
  138.         List<Integer> result =  new ArrayList<>();
  139.         int resultIndex = 0;
  140.  
  141.         for (int i = 0; i < numbers.length; i++) {
  142.             int number = numbers[i];
  143.  
  144.             if (oddOrEvenTester.test(number)){
  145.                 result.add(number);
  146.                 resultIndex++;
  147.             }
  148.  
  149.             if (resultIndex >= count){
  150.                 break;
  151.             }
  152.         }
  153.  
  154.         return result;
  155.     }
  156.  
  157.     private static int findMaxOddOrEvenIndex(Predicate<Integer>oddOrEvenTester) {
  158.         int index = -1;
  159.         int maxNumber = Integer.MIN_VALUE;
  160.  
  161.         for (int i = numbers.length - 1; i >= 0 ; i--) {
  162.             int number = numbers[i];
  163.  
  164.             if (oddOrEvenTester.test(number)){
  165.                 if (number > maxNumber){
  166.                     index = i;
  167.                     maxNumber = number;
  168.                 }
  169.             }
  170.         }
  171.  
  172.         return index;
  173.     }
  174.  
  175.     private static int[] exchange(int index) {
  176.         int[] result =  new int[numbers.length];
  177.         int resultIndex = 0;
  178.  
  179.         for (int i = index + 1; i < numbers.length; i++) {
  180.             result[resultIndex] = numbers[i];
  181.             resultIndex++;
  182.         }
  183.  
  184.         for (int i = 0; i <= index; i++) {
  185.             result[resultIndex] = numbers[i];
  186.             resultIndex++;
  187.         }
  188.  
  189.         return result;
  190.     }
  191.  
  192.     private static Predicate<Integer> createOddOrEvenTester(String oddOrEven) {
  193.         Predicate<Integer> tester = null;
  194.  
  195.         switch (oddOrEven) {
  196.             case "odd":
  197.                 tester = x -> x % 2 != 0;
  198.                 break;
  199.             case "even":
  200.                 tester = x -> x % 2 == 0;
  201.                 break;
  202.         }
  203.  
  204.         return tester;
  205.     }
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement