top10: 1.1.2 - (RED) Explicitly formulated expectations for `Ranking`
[demos/kafka/wordcount] / src / main / java / de / juplo / kafka / wordcount / top10 / Ranking.java
1 package de.juplo.kafka.wordcount.top10;
2
3 import lombok.*;
4
5 import java.util.Arrays;
6 import java.util.LinkedList;
7 import java.util.List;
8
9
10 @AllArgsConstructor(access = AccessLevel.PRIVATE)
11 @NoArgsConstructor
12 @Data
13 public class Ranking
14 {
15   public final static int MAX_ENTRIES = 10;
16
17
18   private Entry[] entries = new Entry[0];
19
20   public Ranking add(Entry newEntry)
21   {
22     if (entries.length == 0)
23     {
24       entries = new Entry[1];
25       entries[0] = newEntry;
26       return this;
27     }
28
29     List<Entry> list = new LinkedList<>(Arrays.asList(entries));
30     for (int i = 0; i < list.size(); i++)
31     {
32       Entry entry;
33
34       entry = list.get(i);
35       if (entry.getCounter() <= newEntry.getCounter())
36       {
37         list.add(i, newEntry);
38         for (int j = i+1; j < list.size(); j++)
39         {
40           entry = list.get(j);
41           if(entry.getWord().equals(newEntry.getWord()))
42           {
43             list.remove(j);
44             break;
45           }
46         }
47         if (list.size() > MAX_ENTRIES)
48         {
49           list = list.subList(0, MAX_ENTRIES);
50         }
51         entries = list.toArray(num -> new Entry[num]);
52         return this;
53       }
54     }
55
56     return this;
57   }
58
59   public static Ranking of(Entry... entries)
60   {
61     return new Ranking(entries);
62   }
63 }