import java.util.*;
class Main {
public static void main
(String[] args
) { String[] data
= {"red",
"green",
"blue",
"red",
"yellow",
"red",
"black",
"red",
"blue",
"white",
"green"}; final int size = 4;
// System.out.println("\n##### Teste com FIFO #####");
// fifo(size, data);
//
// System.out.println("\n##### Teste com LRU #####");
// lru(size, data);
System.
out.
println("\n##### Teste com LFU #####"); lfu(size, data);
}
static void fifo
(final int size,
final String[] data
) { ArrayDeque<String> cache = new ArrayDeque<>();
int misses = 0, hit = 0, access = 0;
if (!cache.contains(d)) {
if (cache.size() < size) {
cache.add(d);
} else {
cache.remove();
cache.add(d);
}
misses++;
} else {
hit++;
}
access++;
System.
out.
printf("access: %d, hit: %d, misses: %d >>> %s\n[ ", access, hit, misses, d
);
}
}
static void lru
(final int size,
final String[] data
) { ArrayDeque<String> cache = new ArrayDeque<>();
int misses = 0, hit = 0, access = 0;
if (!cache.contains(d)) {
if (cache.size() < size) {
cache.add(d);
} else {
cache.remove();
cache.add(d);
}
misses++;
} else {
cache.remove(d);
cache.add(d);
hit++;
}
access++;
System.
out.
printf("access: %d, hit: %d, misses: %d >>> %s\n[ ", access, hit, misses, d
);
}
}
static void lfu
(final int size,
final String[] data
) { class DataWrapper implements Comparable<DataWrapper> {
private int frequency;
this.data = data;
incrementFrequency();
}
void incrementFrequency() {
this.frequency++;
}
@Override
public boolean equals
(Object o
) { DataWrapper dw = (DataWrapper) o;
return dw.data.equals(this.data);
}
@Override
public int compareTo(DataWrapper o) {
if (this.frequency > o.frequency)
return 1;
else if (this.frequency < o.frequency)
return -1;
else
return 0;
}
@Override
return data;
}
}
List<DataWrapper> cache = new ArrayList<>();
List<DataWrapper> temp = new ArrayList<>();
int misses = 0, hit = 0, access = 0;
for (String d
: data
) temp.
add(new DataWrapper
(d
));
for (DataWrapper d : temp) {
if (!cache.contains(d)) {
if (cache.size() < size) {
cache.add(d);
} else {
Object[] aux
= cache.
toArray();
int pos = cache.indexOf( aux[0] );
cache.remove( aux[0] );
cache.add(pos, d);
}
misses++;
} else {
cache.get(cache.indexOf(d)).incrementFrequency();
hit++;
}
access++;
System.
out.
printf("access: %d, hit: %d, misses: %d >>> %s\n[ ", access, hit, misses, d
);
for (DataWrapper x
: cache
) System.
out.
printf("%s(%d) ", x, x.
frequency);
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKY2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU3RyaW5nW10gZGF0YSA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUiLCAicmVkIiwgInllbGxvdyIsICJyZWQiLCAiYmxhY2siLCAicmVkIiwgImJsdWUiLCAid2hpdGUiLCAiZ3JlZW4ifTsKICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IDQ7CgovLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiMjIyMjIFRlc3RlIGNvbSBGSUZPICMjIyMjIik7Ci8vICAgICAgICBmaWZvKHNpemUsIGRhdGEpOwovLwovLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiMjIyMjIFRlc3RlIGNvbSBMUlUgIyMjIyMiKTsKLy8gICAgICAgIGxydShzaXplLCBkYXRhKTsKCiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbiMjIyMjIFRlc3RlIGNvbSBMRlUgIyMjIyMiKTsKICAgICAgICBsZnUoc2l6ZSwgZGF0YSk7CiAgICB9CgogICAgc3RhdGljIHZvaWQgZmlmbyhmaW5hbCBpbnQgc2l6ZSwgZmluYWwgU3RyaW5nW10gZGF0YSkgewogICAgICAgIEFycmF5RGVxdWU8U3RyaW5nPiBjYWNoZSA9IG5ldyBBcnJheURlcXVlPD4oKTsKCiAgICAgICAgaW50IG1pc3NlcyA9IDAsIGhpdCA9IDAsIGFjY2VzcyA9IDA7CgogICAgICAgIGZvciAoU3RyaW5nIGQgOiBkYXRhKSB7CiAgICAgICAgICAgIGlmICghY2FjaGUuY29udGFpbnMoZCkpIHsKICAgICAgICAgICAgICAgIGlmIChjYWNoZS5zaXplKCkgPCBzaXplKSB7CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuYWRkKGQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICBjYWNoZS5hZGQoZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWlzc2VzKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBoaXQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWNjZXNzKys7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiYWNjZXNzOiAlZCwgaGl0OiAlZCwgbWlzc2VzOiAlZCA+Pj4gJXNcblsgIiwgYWNjZXNzLCBoaXQsIG1pc3NlcywgZCk7CgogICAgICAgICAgICBmb3IgKFN0cmluZyB4IDogY2FjaGUpIFN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIHZvaWQgbHJ1KGZpbmFsIGludCBzaXplLCBmaW5hbCBTdHJpbmdbXSBkYXRhKSB7CiAgICAgICAgQXJyYXlEZXF1ZTxTdHJpbmc+IGNhY2hlID0gbmV3IEFycmF5RGVxdWU8PigpOwoKICAgICAgICBpbnQgbWlzc2VzID0gMCwgaGl0ID0gMCwgYWNjZXNzID0gMDsKCiAgICAgICAgZm9yIChTdHJpbmcgZCA6IGRhdGEpIHsKICAgICAgICAgICAgaWYgKCFjYWNoZS5jb250YWlucyhkKSkgewogICAgICAgICAgICAgICAgaWYgKGNhY2hlLnNpemUoKSA8IHNpemUpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZS5hZGQoZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNhY2hlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIGNhY2hlLmFkZChkKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtaXNzZXMrKzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNhY2hlLnJlbW92ZShkKTsKICAgICAgICAgICAgICAgIGNhY2hlLmFkZChkKTsKCiAgICAgICAgICAgICAgICBoaXQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWNjZXNzKys7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiYWNjZXNzOiAlZCwgaGl0OiAlZCwgbWlzc2VzOiAlZCA+Pj4gJXNcblsgIiwgYWNjZXNzLCBoaXQsIG1pc3NlcywgZCk7CgogICAgICAgICAgICBmb3IgKFN0cmluZyB4IDogY2FjaGUpIFN5c3RlbS5vdXQucHJpbnQoeCArICIgIik7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIHZvaWQgbGZ1KGZpbmFsIGludCBzaXplLCBmaW5hbCBTdHJpbmdbXSBkYXRhKSB7CiAgICAgICAgY2xhc3MgRGF0YVdyYXBwZXIgaW1wbGVtZW50cyBDb21wYXJhYmxlPERhdGFXcmFwcGVyPiB7CiAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRhdGE7CiAgICAgICAgICAgIHByaXZhdGUgaW50IGZyZXF1ZW5jeTsKCiAgICAgICAgICAgIERhdGFXcmFwcGVyKFN0cmluZyBkYXRhKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgaW5jcmVtZW50RnJlcXVlbmN5KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZvaWQgaW5jcmVtZW50RnJlcXVlbmN5KCkgewogICAgICAgICAgICAgICAgdGhpcy5mcmVxdWVuY3krKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICAgICAgICAgRGF0YVdyYXBwZXIgZHcgPSAoRGF0YVdyYXBwZXIpIG87CiAgICAgICAgICAgICAgICByZXR1cm4gZHcuZGF0YS5lcXVhbHModGhpcy5kYXRhKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKERhdGFXcmFwcGVyIG8pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZyZXF1ZW5jeSA+IG8uZnJlcXVlbmN5KQogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5mcmVxdWVuY3kgPCBvLmZyZXF1ZW5jeSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIExpc3Q8RGF0YVdyYXBwZXI+IGNhY2hlID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgTGlzdDxEYXRhV3JhcHBlcj4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8PigpOwoKICAgICAgICBpbnQgbWlzc2VzID0gMCwgaGl0ID0gMCwgYWNjZXNzID0gMDsKCiAgICAgICAgZm9yIChTdHJpbmcgZCA6IGRhdGEpIHRlbXAuYWRkKG5ldyBEYXRhV3JhcHBlcihkKSk7CgogICAgICAgIGZvciAoRGF0YVdyYXBwZXIgZCA6IHRlbXApIHsKICAgICAgICAgICAgaWYgKCFjYWNoZS5jb250YWlucyhkKSkgewogICAgICAgICAgICAgICAgaWYgKGNhY2hlLnNpemUoKSA8IHNpemUpIHsKICAgICAgICAgICAgICAgICAgICBjYWNoZS5hZGQoZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGF1eCA9IGNhY2hlLnRvQXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChhdXgpOwoKICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gY2FjaGUuaW5kZXhPZiggYXV4WzBdICk7CgogICAgICAgICAgICAgICAgICAgIGNhY2hlLnJlbW92ZSggYXV4WzBdICk7CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuYWRkKHBvcywgZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWlzc2VzKys7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjYWNoZS5nZXQoY2FjaGUuaW5kZXhPZihkKSkuaW5jcmVtZW50RnJlcXVlbmN5KCk7CiAgICAgICAgICAgICAgICBoaXQrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYWNjZXNzKys7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiYWNjZXNzOiAlZCwgaGl0OiAlZCwgbWlzc2VzOiAlZCA+Pj4gJXNcblsgIiwgYWNjZXNzLCBoaXQsIG1pc3NlcywgZCk7CgogICAgICAgICAgICBmb3IgKERhdGFXcmFwcGVyIHggOiBjYWNoZSkgU3lzdGVtLm91dC5wcmludGYoIiVzKCVkKSAiLCB4LCB4LmZyZXF1ZW5jeSk7CgogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsKICAgICAgICB9CiAgICB9Cn0=
##### 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
[ red(2) green(1) blue(1) ]
access: 5, hit: 1, misses: 4 >>> yellow
[ red(2) green(1) blue(1) yellow(1) ]
access: 6, hit: 2, misses: 4 >>> red
[ red(3) green(1) blue(1) yellow(1) ]
access: 7, hit: 2, misses: 5 >>> black
[ red(3) black(1) blue(1) yellow(1) ]
access: 8, hit: 3, misses: 5 >>> red
[ red(4) black(1) blue(1) yellow(1) ]
access: 9, hit: 4, misses: 5 >>> blue
[ red(4) black(1) blue(2) yellow(1) ]
access: 10, hit: 4, misses: 6 >>> white
[ red(4) white(1) blue(2) yellow(1) ]
access: 11, hit: 4, misses: 7 >>> green
[ red(4) green(1) blue(2) yellow(1) ]