Suche List/Queue mit: fixer Länge, Elemente autom. entfernen


StehtimSchilf

Erfahrenes Mitglied
#1
Hi Forum

Ich suche ein List/Queue-Konstrukt mit folgenden Eigenschaften:
- fixer Grösse (kann zur Laufzeit verändert werden)
- iterierbar
- add(). Wenn durch add() die Grösse überschritten wird, so wird das älteste Element "gelöscht". D.h. die "Queue" hat max. die definierte Grösse
- remove()

Ich finde leider nix passendes in den bestehenden libraries. Bin aber überzeugt, dass es das mit der fixen Grösse und dem automatisch "rausschieben" des ältesten Element doch geben muss? Hat evtl. jemand bereits ein solches Konstrukt?

cheerioh & Danke
SiS
 

Anime-Otaku

Erfahrenes Mitglied
#2
Mir ist auch keine Queue bekannt die das hat. Die Anforderung hört sich auch stark nach einem Fifo Cache an.

Man kann das ganze mit einer LinkedHashMap hinbekommen:

http://javaeffective.wordpress.com/2011/05/23/simple-lru-or-fifo-cache/

Java:
private static final int MAX = 50;

private final Map cache = Collections.synchronizedMap(
        new LinkedHashMap(MAX) {

            /** Serial UID. */
            private static final long serialVersionUID = 2546245625L;

            @Override
            protected boolean removeEldestEntry(Map.Entry eldest) {
                return size() > MAX;
            }
        });
 
#3
Hallo,

was meinst du genau mit dem "ältesten" Element? Bei einer Queue (java.util.Queue<E>) wäre dies
das Element am Anfang, da bei dieser Struktur Elemente nur hinten angefügt und vorne wieder entnommen werden können. Es gibt aber auch auch Erweiterungen von Queue wie z.B. eine Deque (java.util.Deque<E>) die das einfügen / entfernen / testen von Elementen vorne und hinten erlauben.

Aber ich gehe jetzt einfach mal von der normalen Queue aus.

Suchst du vielleicht sowas?
Java:
package de.tutorials.training;

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

public class QueueExample {

  public static void main(String[] args) {
    int queueCapacity = 5;
    Queue<Integer> q = new ArrayBlockingQueue<Integer>(queueCapacity);

    for (int i = 0; i < queueCapacity + 3; i++) {
      while(!q.offer(i)){
        System.out.println("Discarding: " + q.poll()); //discard oldest entry
      }
    }

    System.out.println(q);

  }
}
Ausgabe:
Code:
Discarding: 0
Discarding: 1
Discarding: 2
[3, 4, 5, 6, 7]
Gruß Tom
 
#4
Hallo,

ist mir gerade begegnet: MinMaxPriorityQueue aus den guava-libraries könnte das sein, was du suchst, wenn du die Prioritäten auf Basis des negierten Einfügezeitpunktes (-System.currentTimeMillis()) in der Queue bestimmst.

...
* <p>A min-max priority queue can be configured with a maximum size. If so,
* each time the size of the queue exceeds that value, the queue automatically
* removes its greatest element according to its comparator (which might be the
* element that was just added). This is different from conventional bounded
* queues, which either block or reject new elements when full.
...
Vorsicht ... die Klasse ist nicht Threadsafe! ... aber das war ja auch keine explizite Anforderung.

http://docs.guava-libraries.googlec...oogle/common/collect/MinMaxPriorityQueue.html

Gruß Tom