आप LinkedHashMap उपयोग कर सकते हैं और उसके removeEldestEntry विधि ओवरराइड:
public class FixedStack extends LinkedHashMap<Long, String> {
private final int capacity;
public FixedStack(int capacity) {
this.capacity = capacity;
}
@Override
protected boolean removeEldestEntry(final Map.Entry<Long, String> eldest) {
return super.size() > capacity;
}
}
और यह परीक्षण करने के लिए:
public static void main(String[] args) {
FixedStack stack = new FixedStack(10);
long added = 0;
for (Locale locale : Locale.getAvailableLocales()) {
if (locale.getDisplayCountry().length() > 0) {
stack.put(added, locale.getDisplayCountry());
System.out.println(locale.getDisplayCountry());
added++;
}
}
System.out.println(String.format(">>>>>>>>> %s added",
added));
Iterator<Entry<Long, String>> iterator = stack.entrySet().iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getValue());
}
}
आपको बस यह तय करना होगा कि आप कुंजी के रूप में क्या उपयोग करना चाहते हैं, मैंने उदाहरण में एक साधारण काउंटर का उपयोग किया।
import java.util.Stack;
public class SizedStack<T> extends Stack<T> {
private int maxSize;
public SizedStack(int size) {
super();
this.maxSize = size;
}
@Override
public T push(T object) {
//If the stack is too big, remove elements until it's the right size.
while (this.size() >= maxSize) {
this.remove(0);
}
return super.push(object);
}
}
इस तरह इसका इस्तेमाल: SizedStack<Float> mySizedStack = new SizedStack<Float>(10);
स्रोत
2011-10-11 16:17:31
FYI करें setSize विधि वेक्टर से विरासत में मिली है, जिसका अर्थ है कि setSize कारण होगा nulls प्रदान की नई आकार को भरने के लिए जोड़े जाने के लिए, या नए आकार से परे मौजूदा वस्तुओं छोड़ दिए जाते हैं। आप सिद्धांत में ऐसा कर सकते हैं अगर (stack.size()> = 10) {stack.setSize (10); } जब भी आप ढेर पर धक्का देते हैं, लेकिन यह आपकी खुद की कस्टम कक्षा को लागू करना बेहतर होगा। – Thor84no
मैंने मूल रूप से यह देखने के लिए कोशिश की कि यह काम करेगा या नहीं। यह अजीब है, लेकिन ऐसा लगता है कि जब मैं स्टैक पर setSize() करता हूं, तो यह आइटम के क्रम को उलट देता है और उन्हें वहां से छोटा करता है। इसलिए मैं हमेशा स्टैक में मूल 10 आइटम के साथ समाप्त होता हूं। इसी प्रकार, ऐसा करने के लिए एक और त्वरित/गंदा तरीका है (stack.size()> = 10) {stack.remove (0); } वही समस्या उत्पन्न होती है जहां यह आदेश को उलट देता है, इसलिए किसी कारण से 0 सूचकांक निकालना है। – koopaking3
शायद इसका मतलब यह है कि अंतर्निहित कार्यान्वयन वास्तव में उस तरह से काम करता है और स्टैक विधियां आपको विपरीत क्रम में चीजें वापस कर रही हैं, जो वैसे भी बहुत समझ में आता है। – Thor84no