fork(1) download
  1. import java.util.*;
  2.  
  3. class Program {
  4. public static void main(String[] args) {
  5. String[] data = {"red", "green", "blue", "red", "yellow", "red", "black", "red", "blue", "white", "green"};
  6. final int size = 4;
  7.  
  8. System.out.println("\n##### Teste com FIFO #####");
  9. fifo(size, data);
  10.  
  11. System.out.println("\n##### Teste com LRU #####");
  12. lru(size, data);
  13.  
  14. System.out.println("\n##### Teste com LFU #####");
  15. lfu(size, data);
  16. }
  17.  
  18. static void fifo(final int size, final String[] data) {
  19. ArrayDeque<String> cache = new ArrayDeque<>();
  20.  
  21. int misses = 0, hit = 0, access = 0;
  22.  
  23. for (String d : data) {
  24. if (!cache.contains(d)) {
  25. if (cache.size() < size) {
  26. cache.add(d);
  27. } else {
  28. cache.remove();
  29. cache.add(d);
  30. }
  31.  
  32. misses++;
  33. } else {
  34. hit++;
  35. }
  36.  
  37. access++;
  38.  
  39. System.out.printf("access: %d, hit: %d, misses: %d >>> %s\n[ ", access, hit, misses, d);
  40.  
  41. for (String x : cache) System.out.print(x + " ");
  42.  
  43. System.out.println("]");
  44. }
  45. }
  46.  
  47. static void lru(final int size, final String[] data) {
  48. ArrayDeque<String> cache = new ArrayDeque<>();
  49.  
  50. int misses = 0, hit = 0, access = 0;
  51.  
  52. for (String d : data) {
  53. if (!cache.contains(d)) {
  54. if (cache.size() < size) {
  55. cache.add(d);
  56. } else {
  57. cache.remove();
  58. cache.add(d);
  59. }
  60.  
  61. misses++;
  62. } else {
  63. cache.remove(d);
  64. cache.add(d);
  65.  
  66. hit++;
  67. }
  68.  
  69. access++;
  70.  
  71. System.out.printf("access: %d, hit: %d, misses: %d >>> %s\n[ ", access, hit, misses, d);
  72.  
  73. for (String x : cache) System.out.print(x + " ");
  74.  
  75. System.out.println("]");
  76. }
  77. }
  78.  
  79. static void lfu(final int size, final String[] data) {
  80. class DataWrapper implements Comparable<DataWrapper> {
  81. private final String data;
  82. private int frequency;
  83.  
  84. DataWrapper(String data) {
  85. this.data = data;
  86. incrementFrequency();
  87. }
  88.  
  89. void incrementFrequency() {
  90. this.frequency++;
  91. }
  92.  
  93. @Override
  94. public boolean equals(Object o) {
  95. DataWrapper dw = (DataWrapper) o;
  96. return dw.data.equals(this.data);
  97. }
  98.  
  99. @Override
  100. public int compareTo(DataWrapper o) {
  101. if (this.frequency > o.frequency)
  102. return 1;
  103. else if (this.frequency < o.frequency)
  104. return -1;
  105. else
  106. return 0;
  107. }
  108.  
  109. @Override
  110. public String toString() {
  111. return data;
  112. }
  113. }
  114.  
  115. List<DataWrapper> cache = new ArrayList<>();
  116. List<DataWrapper> temp = new ArrayList<>();
  117.  
  118. int misses = 0, hit = 0, access = 0;
  119.  
  120. for (String d : data) temp.add(new DataWrapper(d));
  121.  
  122. for (DataWrapper d : temp) {
  123. if (!cache.contains(d)) {
  124. if (cache.size() < size) {
  125. cache.add(d);
  126. } else {
  127. cache.remove(0);
  128. cache.add(d);
  129. }
  130.  
  131. misses++;
  132. } else {
  133. cache.get(cache.indexOf(d)).incrementFrequency();
  134. hit++;
  135. }
  136.  
  137. Collections.sort(cache);
  138. access++;
  139.  
  140. System.out.printf("access: %d, hit: %d, misses: %d >>> %s\n[ ", access, hit, misses, d);
  141.  
  142. for (DataWrapper x : cache) System.out.printf("%s(%d) ", x, x.frequency);
  143.  
  144. System.out.println("]");
  145. }
  146. }
  147. }
Success #stdin #stdout 0.07s 4386816KB
stdin
Standard input is empty
stdout
##### Teste com FIFO #####
access: 1, hit: 0, misses: 1 >>> red
[ red ]
access: 2, hit: 0, misses: 2 >>> green
[ red green ]
access: 3, hit: 0, misses: 3 >>> blue
[ red green blue ]
access: 4, hit: 1, misses: 3 >>> red
[ red green blue ]
access: 5, hit: 1, misses: 4 >>> yellow
[ red green blue yellow ]
access: 6, hit: 2, misses: 4 >>> red
[ red green blue yellow ]
access: 7, hit: 2, misses: 5 >>> black
[ green blue yellow black ]
access: 8, hit: 2, misses: 6 >>> red
[ blue yellow black red ]
access: 9, hit: 3, misses: 6 >>> blue
[ blue yellow black red ]
access: 10, hit: 3, misses: 7 >>> white
[ yellow black red white ]
access: 11, hit: 3, misses: 8 >>> green
[ black red white green ]

##### Teste com LRU #####
access: 1, hit: 0, misses: 1 >>> red
[ red ]
access: 2, hit: 0, misses: 2 >>> green
[ red green ]
access: 3, hit: 0, misses: 3 >>> blue
[ red green blue ]
access: 4, hit: 1, misses: 3 >>> red
[ green blue red ]
access: 5, hit: 1, misses: 4 >>> yellow
[ green blue red yellow ]
access: 6, hit: 2, misses: 4 >>> red
[ green blue yellow red ]
access: 7, hit: 2, misses: 5 >>> black
[ blue yellow red black ]
access: 8, hit: 3, misses: 5 >>> red
[ blue yellow black red ]
access: 9, hit: 4, misses: 5 >>> blue
[ yellow black red blue ]
access: 10, hit: 4, misses: 6 >>> white
[ black red blue white ]
access: 11, hit: 4, misses: 7 >>> green
[ red blue white green ]

##### Teste com LFU #####
access: 1, hit: 0, misses: 1 >>> red
[ red(1) ]
access: 2, hit: 0, misses: 2 >>> green
[ red(1) green(1) ]
access: 3, hit: 0, misses: 3 >>> blue
[ red(1) green(1) blue(1) ]
access: 4, hit: 1, misses: 3 >>> red
[ green(1) blue(1) red(2) ]
access: 5, hit: 1, misses: 4 >>> yellow
[ green(1) blue(1) yellow(1) red(2) ]
access: 6, hit: 2, misses: 4 >>> red
[ green(1) blue(1) yellow(1) red(3) ]
access: 7, hit: 2, misses: 5 >>> black
[ blue(1) yellow(1) black(1) red(3) ]
access: 8, hit: 3, misses: 5 >>> red
[ blue(1) yellow(1) black(1) red(4) ]
access: 9, hit: 4, misses: 5 >>> blue
[ yellow(1) black(1) blue(2) red(4) ]
access: 10, hit: 4, misses: 6 >>> white
[ black(1) white(1) blue(2) red(4) ]
access: 11, hit: 4, misses: 7 >>> green
[ white(1) green(1) blue(2) red(4) ]