1- import java .util .ArrayList ;
2- import java .util .List ;
3- import java .util .Map ;
4- import java .util .TreeMap ;
1+ package sort ;
2+
3+ import java .util .*;
54import java .util .stream .IntStream ;
65import java .util .stream .Stream ;
76
87import static java .util .stream .Collectors .toList ;
98import static java .util .stream .Collectors .toMap ;
9+ import static sort .SortUtils .print ;
1010
1111/**
1212 *
1313 * @author Youssef Ali (https://github.com/youssefAli11997)
1414 * @author Podshivalov Nikita (https://github.com/nikitap492)
1515 *
1616 */
17- class CountingSort {
17+ class CountingSort implements SortAlgorithm {
18+
19+
20+
21+ @ Override
22+ public <T extends Comparable <T >> T [] sort (T [] unsorted ) {
23+ return sort (Arrays .asList (unsorted )).toArray (unsorted );
24+ }
1825
1926 /**
2027 * This method implements the Generic Counting Sort
@@ -24,7 +31,8 @@ class CountingSort {
2431 * Sorts the list in increasing order
2532 * The method uses list elements as keys in the frequency map
2633 **/
27- public static <T extends Comparable <T >> List <T > countingSort (List <T > list ) {
34+ @ Override
35+ public <T extends Comparable <T >> List <T > sort (List <T > list ) {
2836
2937 Map <T , Integer > frequency = new TreeMap <>();
3038 // The final output array
@@ -46,12 +54,12 @@ public static <T extends Comparable<T>> List<T> countingSort(List<T> list) {
4654
4755 /**
4856 * Stream Counting Sort
49- * The same as method {@link CountingSort#countingSort (List)} but this method uses stream API
57+ * The same as method {@link CountingSort#sort (List)} } but this method uses stream API
5058 *
5159 * @param list The list to be sorted
5260 *
5361 **/
54- public static <T extends Comparable <T >> List <T > streamCountingSort (List <T > list ) {
62+ private static <T extends Comparable <T >> List <T > streamSort (List <T > list ) {
5563 return list .stream ()
5664 .collect (toMap (k -> k , v -> 1 , (v1 , v2 ) -> v1 + v2 , TreeMap ::new ))
5765 .entrySet ()
@@ -64,43 +72,31 @@ public static <T extends Comparable<T>> List<T> streamCountingSort(List<T> list)
6472 public static void main (String [] args ) {
6573 // Integer Input
6674 List <Integer > unsortedInts = Stream .of (4 , 23 , 6 , 78 , 1 , 54 , 23 , 1 , 9 , 231 , 9 , 12 ).collect (toList ());
75+ CountingSort countingSort = new CountingSort ();
6776
6877 System .out .println ("Before Sorting:" );
69- printList (unsortedInts );
78+ print (unsortedInts );
7079
7180 // Output => 1 1 4 6 9 9 12 23 23 54 78 231
7281 System .out .println ("After Sorting:" );
73- printList (countingSort (unsortedInts ));
82+ print (countingSort . sort (unsortedInts ));
7483 System .out .println ("After Sorting By Streams:" );
75- printList ( streamCountingSort (unsortedInts ));
84+ print ( streamSort (unsortedInts ));
7685
7786 System .out .println ("\n ------------------------------\n " );
7887
7988 // String Input
8089 List <String > unsortedStrings = Stream .of ("c" , "a" , "e" , "b" ,"d" , "a" , "f" , "g" , "c" ).collect (toList ());
8190
8291 System .out .println ("Before Sorting:" );
83- printList (unsortedStrings );
92+ print (unsortedStrings );
8493
8594 //Output => a a b c c d e f g
8695 System .out .println ("After Sorting:" );
87- printList (countingSort (unsortedStrings ));
96+ print (countingSort . sort (unsortedStrings ));
8897
8998 System .out .println ("After Sorting By Streams:" );
90- printList (streamCountingSort (unsortedStrings ));
91-
92- }
99+ print (streamSort (unsortedStrings ));
93100
94- /**
95- * Just print list
96- * @param toPrint - a list which should be printed
97- */
98- private static void printList (List <?> toPrint ){
99- toPrint .stream ()
100- .map (Object ::toString )
101- .map (str -> str + " " )
102- .forEach (System .out ::print );
103-
104- System .out .println ();
105101 }
106102}
0 commit comments