Coverage Summary for Class: Utils (it.polimi.ingsw.Misc)
| Class | Class, % | Method, % | Branch, % | Line, % |
|---|---|---|---|---|
| Utils | 100% (1/1) | 85,7% (6/7) | 91,7% (11/12) | 93,3% (28/30) |
1 package it.polimi.ingsw.Misc; 2 3 import it.polimi.ingsw.Exceptions.Input.InvalidElementException; 4 5 import java.util.*; 6 7 /** 8 * This class contains various static functions useful for more than one purpose inside the code. 9 * Check the docs of each function for more info. 10 */ 11 public class Utils { 12 /** 13 * Given a {@link List}, shuffles it in place with a random seed 14 * 15 * @param coll the list to shuffle 16 * @param <T> the type of the elements of the list 17 */ 18 public static <T> void shuffle(List<T> coll) { 19 Collections.shuffle(coll, new Random(System.currentTimeMillis())); 20 } 21 22 /** 23 * Given a {@link List}, returns a random element from it 24 * 25 * @param list the list to fetch from 26 * @param <T> the type of the list's elements 27 * @return a random element from the list 28 */ 29 public static <T> T random(List<T> list) { 30 Random random = new Random(); 31 int randomNumber = random.nextInt(list.size()); 32 return list.get(randomNumber); 33 } 34 35 /** 36 * Selects an element in the list as if it was a circular array 37 * 38 * @param startingElement the element from which to start counting forwards 39 * @param group the list to fetch from 40 * @param movement the amount of steps forward from the starting element to take in order to reach the fetched element 41 * @param <T> the type of elements of the group 42 * @return an element from the group 43 * @throws InvalidElementException if startingElement is not present in the list 44 */ 45 public static <T> T modularSelection(T startingElement, List<T> group, int movement) throws InvalidElementException { 46 int index = group.indexOf(startingElement); 47 if (index == -1) { 48 throw new InvalidElementException("starting element"); 49 } 50 return group.get((index + group.size() + movement) % group.size()); 51 } 52 53 /** 54 * Given two maps, evaluate whether the second map contains values that can fit the first map 55 * 56 * @param originalSet the first map is the "original" 57 * @param possibleSubset the second map is a "possible subset" of the original 58 * @param <T> the key of both maps 59 * @param <C> an element extending the Integer class as the value of both maps 60 * @return true if the second map is a possible subset of the original, meaning the values for each key in the possible subset 61 * are lower than the values for the same key in the original map. otherwise returns false 62 */ 63 public static <T, C extends Integer> boolean canMapFit(Map<T, C> originalSet, Map<T, C> possibleSubset) { 64 for (Map.Entry<T, C> entry : possibleSubset.entrySet()) { 65 T key = entry.getKey(); 66 int count = entry.getValue(); 67 if (!originalSet.containsKey(key) || ((int) originalSet.get(key) - count < 0)) { 68 return false; 69 } 70 } 71 return true; 72 } 73 74 /** 75 * Given a list, find occurrences of elements of the same class within it. 76 * 77 * @param selected the class object to search for in the list 78 * @param list the list to search in 79 * @param <T> the elements of the list 80 * @param <E> an inheritor of the class of elements contained in the list 81 * @return the count of how many elements of the list match the input class 82 */ 83 public static <T, E extends T> int countSimilarClassOccurrences(Class<E> selected, List<T> list) { 84 return (int) list.stream().filter(pa -> pa.getClass() == selected).count(); 85 } 86 87 /** 88 * Given a {@link List}, sorts its elements in order of frequency from highest to lowest 89 * 90 * @param array the list to sort 91 * @param <T> the type of the elements in the list 92 * @return a new {@link List}, containing the elements of the previous one sorted by frequency 93 */ 94 public static <T> List<T> sortByFrequency(List<T> array) { 95 Map<T, ArrayList<T>> frequencyMap = new HashMap<>(); 96 for (T current : array) { 97 ArrayList<T> list = frequencyMap.getOrDefault(current, new ArrayList<>()); 98 list.add(current); 99 frequencyMap.put(current, list); 100 } 101 ArrayList<T> sorted = new ArrayList<>(); 102 frequencyMap.entrySet().stream() 103 .sorted(Comparator.comparingInt(o -> o.getValue().size())) 104 .map(Map.Entry::getValue) 105 .forEach(sorted::addAll); 106 Collections.reverse(sorted); 107 return sorted; 108 } 109 }