Я хочу создать стек фиксированного размера и обрезать стек, когда он будет заполнен. Для этого уже существует подход в создании стека фиксированного размера, но я не хочу реализовывать класс.
Можно сделать что-то подобное?
Stack<String> stack = new Stack<String>(){
private static final long serialVersionUID = 1L;
public String push(String item) {
if (this.size() == FIXED_SIZE) {
//truncate()
}
return super.push(item);
}
};
Остальные методы стека остаются прежними?
Так вот что я нашел в документации. Я не использовал и не тестировал его. Поэтому я не уверен, как это сработает. Поскольку removeElementAt()
наследуется от класса Vector, и я надеюсь, что removeElementAt(0)
, все равно удалит элемент внизу.
Stack<String> stack = new Stack<String>(){
private static final long serialVersionUID = 1L;
public String push(String item) {
if (this.size() == FIXED_SIZE) {
this.removeElementAt(0);
}
return super.push(item);
}
};
И также я предполагаю, что вы имели в виду, что усечка заключается в удалении элемента first-in, находящегося в данный момент в списке, если вы просто хотите отклонить новый приближающийся элемент, вы можете просто вернуть null
.
Как насчет чего-то вроде этого:
Public class TruncatedStack<T> extends FixedStack<T>
{
private static final long serialVersionUID = 1L;
@Override
public String push(String item) {
if (this.top == size) {
this.top = -1;
return super.push(item);
}
}
Написал это с моей головы (непроверенный). Как упоминалось в комментариях, стек фиксированного размера представляет собой просто массив со счетчиком, чтобы отслеживать верх.
public class FixedSizeStack {
int top, numElements;
int[] baseArray;
public FixedSizeStack(int maxSize) {
top = 0;
numElements = 0;
baseArray = new int[maxSize];
}
public void push(int num) {
baseArray[top] = num;
top = (top+1) % baseArray.length;
numElements++;
}
public int pop(int num) {
if(numElements == 0) return null; //or throw exception--you've removed too many elements!
numElements--;
top = (top == 0) ? (baseArray.length - 1) : (top - 1);
return baseArray[top];
}
}