Любой способ установить максимальный размер коллекции?

Вы не можете, Предварительный просмотр быть функцией браузера, и поэтому должны быть защищены от того, чтобы быть названным JavaScript, поскольку это была бы угроза безопасности.

Вот почему Ваш пример использует Активный X, который обходит проблемы безопасности JavaScript.

Так вместо этого используют таблицу стилей печати, что Вы уже должны иметь и показать его для media=screen, распечатайте вместо media=print.

Read Alist Независимо: Попытка Распечатать для хорошей статьи на предмет таблиц стилей печати.

21
задан Jarek 4 March 2011 в 15:55
поделиться

7 ответов

Если вы не возражаете против внешней библиотеки, вы можете воспользоваться EvictingQueue .

Пример от srigalamilitan:

Queue<String> evictingQueue= EvictingQueue.create(10);
String message="This Is Evicting Queue ";

for (int i = 1; i <= 15; i++) {
    evictingQueue.add(message + i);
    System.out.println("EvictingQueue size: " + evictingQueue.size());
}

System.out.println("Poll Queue Evicting");
while(!evictingQueue.isEmpty()){
    println(evictingQueue.poll());
}

печатает:

This Is Evicting Queue 6
This Is Evicting Queue 7
This Is Evicting Queue 8
This Is Evicting Queue 9
This Is Evicting Queue 10
This Is Evicting Queue 11
This Is Evicting Queue 12
This Is Evicting Queue 13
This Is Evicting Queue 14
This Is Evicting Queue 15
2
ответ дан 29 November 2019 в 20:59
поделиться

Большинство общих коллекций в стандартной библиотеке НЕ имеют жесткой емкости - только минимальное начальное распределение. Единственное исключение, которое я могу придумать, - LinkedBlockingQueue. Другие библиотеки имеют другие ограниченные коллекции, такие как LRUCache.

Должно быть довольно просто создать свою собственную обертку, если это полезно для вас.

1
ответ дан 29 November 2019 в 20:59
поделиться

Вы можете установить начальную емкость некоторых коллекций. Я не думаю, вы можете установить максимальный размер.

Вы можете встроить эту логику в свои доменные классы (бизнес-логику) для обеспечения максимального размера. Или вы можете создать подкласс ....

0
ответ дан 29 November 2019 в 20:59
поделиться

Супер легко создать свой собственный класс, расширяющий коллекцию. Я просто сделал это для моей собственной ситуации, расширив HashSet:

import java.util.HashSet;

public class LimitedHashSet<E> extends HashSet<E> {
    private static final long serialVersionUID = -23456691722L;
    private final int limit;

    public LimitedHashSet(int limit) {
        this.limit = limit;
    }

    @Override
    public boolean add(E object) {
        if (this.size() > limit) return false;
        return super.add(object);
    }

} 
1
ответ дан 29 November 2019 в 20:59
поделиться

Если вы имеете в виду «есть ли в интерфейсе Collection метод (или его стандартные реализации), где вы можете задать размер, ответом которого будет« нет ». Можете ли вы написать (или расширить) класс с максимальным размером, чем вы, конечно может.

0
ответ дан 29 November 2019 в 20:59
поделиться

Вот мой собственный код для ArrayList с максимальным размером, созданный на основе ответа Мэтью Джиллиарда. Он переопределяет все три конструктора из ArrayList, а также переопределяет .AddAll().

import java.util.ArrayList;
import java.util.Collection;

public class MaxedArrayList<E> extends ArrayList<E> {
    final int MAXSIZE;

    public MaxedArrayList(int initialCapacity, final int MAXSIZE) {
        super(initialCapacity);
        this.MAXSIZE = MAXSIZE;
    }

    public MaxedArrayList(final int MAXSIZE) {
        super();
        this.MAXSIZE = MAXSIZE;
    }

    public MaxedArrayList(Collection<? extends E> c, final int MAXSIZE) {
        super(c);
        this.MAXSIZE = MAXSIZE;
        sizeCheck();
    }

    private boolean sizeCheck() {
        //returns true if operation is legal.
        return (size() <= MAXSIZE);
    }

    private boolean sizeCheck(int deltaElements) {
        if (deltaElements < 0) throw new IllegalArgumentException();
        //returns true if operation is legal.
        return (size() + deltaElements <= MAXSIZE);
    }

    @Override
    public void add(int index, E element) throws IllegalStateException {
        if (!sizeCheck()) throw throwException();
        super.add(index, element);
    }

    @Override
    public boolean addAll(Collection<? extends E> c) throws IllegalStateException {
        if (!sizeCheck(c.size())) throw throwException();
        return (super.addAll(c));
    }

    private IllegalStateException throwException() {
        return new IllegalStateException("Request is over MaxArrayList max size. Elements not added.");
    }
}
0
ответ дан 29 November 2019 в 20:59
поделиться

ArrayBlockingQueue и LinkedBlockingQueue поддерживают максимальный размер. LinkedHashMap поддерживает удаление самых старых или наименее недавно использованных предметов при достижении максимального размера.

Что вы хотите делать, когда достигается максимальный размер?

7
ответ дан 29 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: