Создавать систему батарейки LIFO со сноской после того, как быть полным в Java

Я хочу разработать систему, устанавливая метод склада данных, стиль батарейку, но со своеобразием, что, когда он подойдет близко максимально (3), первый элемент батарейки был удален, чтобы так только поддерживать последнюю стоимость.

Общий рисунок:

Пока было возможно хранить информацию, которая они помещала бы один за другим (1,2,3...)

1: A
2: B
3: C

Если батарейка полная и хочется добавлять новую информацию, первый элемент был удален и сделайте ротацию с другими, для так последней принятой в доме информации будьте последний.

1: B
2: C
3: D

если добавляется другой (C, D, E) а именно только сохраняли последние 3 введенных данных.

Тип информации, который должен сохранять, что он был персонализированного класса TextDataStatus Объект TextDataStatus

public class TextDataStatus {

    int action;
    String content;
    int start;
    int end;

    public TextDataStatus(int action, String content, int start, int end) {
        this.action = action;
        this.content = content;
        this.start = start;
        this.end = end;
    }

    public int getAction() {
        return action;
    }

    public void setAction(int action) {
        this.action = action;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }

    @Override
    public String toString() {
        return "TextDataStatus{" +
                "action=" + action +
                ", content='" + content + '\'' +
                ", start=" + start +
                ", end=" + end +
                '}';
    }
}

Метод извлечения должен быть стилем LIFO (Last Неудар в лунку Фирст Оутпут), и который позволяет хранить дублированные данные.

3
задан 04.06.2017, 04:18
2 ответа

Разъяснение:

Ты говоришь, что ты хочешь LIFO (last in first out - последний, который входит, - первый, который выходит), но пример, который ты предоставляешь, - FIFO (first in first out - первый, который входит, - первый, который выходит), так как ты удаляешь A, которая была первой в том, чтобы входить.

Но не беспокойся, будьте каковым будьте твой случай (я понимаю что FIFO) кто-то уже занялся темой и у Java есть классы для этого и, хотя они не будут точно тем, в чем ты нуждаешься, они будут избавлять нам от большинства работы.


FIFO: Queue

Объект Queue - особенное осуществление LinkedList, может способствовать тому, чтобы у stack объектов был его собственный порядок основываясь в equals и hashCode объектов, которые он содержит, но по умолчанию, это stack FIFO, как ты сможешь видеть:

ПРИМЕР:

import java.util.LinkedList;
import java.util.Queue;

private final static String[] letras = { "A", "B", "C", "D", "E" };

Queue<String> fifo = new LinkedList<String>();

for (String s : letras) {
    fifo.add(s);
}

System.out.println(fifo);

while (!fifo.isEmpty()) {
    System.out.println("La que se añadio mas recientemente es " + fifo.remove());
    System.out.println(fifo);
}

Выход:

[A, B, C, D, E]
La que se añadio mas recientemente es A
[B, C, D, E]
La que se añadio mas recientemente es B
[C, D, E]
La que se añadio mas recientemente es C
[D, E]
La que se añadio mas recientemente es D
[E]
La que se añadio mas recientemente es E
[]

LimitedFIFOList<E>

С этого времени, хотя класс способствует wrapper тому, чтобы он защитил способы добавлять, ты сможешь контролировать это максимального размера и иметь getter предела помимо size():

import java.util.LinkedList;

public class LimitedFIFOList<E> extends LinkedList<E> {
    private static final long serialVersionUID = 1L;
    private int limite;

    public LimitedFIFOList(int limite) {
        this.limite = limite;
    }

    @Override
    public boolean add(E o) {
        super.add(o);
        // si el tamaño fuera mayor eliminamos uno 
        while (size() > limite) { super.remove(); }
        return true;
    }

    public int getLimite() {
        return limite;
    }

    public void setLimite(int limite) {
        this.limite = limite;
    }    

}

Что используя предыдущий пример:

private static void FIFO() {
    LimitedFIFOList<TextDataStatus> fifo = new LimitedFIFOList<TextDataStatus>(3);

    for (TextDataStatus d : datos) {
        fifo.add(d);
        System.out.println(fifo.toString());
    }
}

Выход:

[TextDataStatus{action=1, content='A', start=1, end=6}
]
[TextDataStatus{action=1, content='A', start=1, end=6}
, TextDataStatus{action=1, content='B', start=2, end=7}
]
[TextDataStatus{action=1, content='A', start=1, end=6}
, TextDataStatus{action=1, content='B', start=2, end=7}
, TextDataStatus{action=1, content='C', start=3, end=8}
]
[TextDataStatus{action=1, content='B', start=2, end=7}
, TextDataStatus{action=1, content='C', start=3, end=8}
, TextDataStatus{action=1, content='D', start=4, end=9}
]
[TextDataStatus{action=1, content='C', start=3, end=8}
, TextDataStatus{action=1, content='D', start=4, end=9}
, TextDataStatus{action=1, content='E', start=5, end=10}
]

LIFO Collection: Stack

Так как мы, и что вопрос немного смущен, мы будем объяснять также классы LIFO, у которого есть Java, и как провождение им границы, чтобы иметь полный parejíta. Для этого, мы используем Stack.

The Stack class represents в last-in-first-out (LIFO) stack of objects. It extends class Вектор with five operations that allow в вектор to be treated схвати в stack. Общепринятый The push and pop operations пахал provided, эксперт well схвати в method to peek at the top статью on the stack, в method to тест for whether the stack is empty, and в method to search the stack for an статья and discover how far it is from the top.

ПРИМЕР:

import java.util.Stack;

private final static String[] letras = { "A", "B", "C", "D", "E" };

Stack<String> st = new Stack<String>();

for (String s : letras) {
    st.add(s);
}

System.out.println(st.toString());  //     [A, B, C, D, E]
// cambiando el tamaño a menos de los objetos que contiene
// elimina los ultimos objetos añadidos
st.setSize(3);
System.out.println(st.toString());  //     [A, B, C]
// pop quita el que se haya añadido el ultimo
st.pop();
System.out.println(st.toString());  //    [A, B]

Выход:

[A, B, C, D, E]
[A, B, C]
[A, B]

LimitedLIFOList<E>

Если бы твой случай снаружи этот, wrapper был очень похожим, но с Stack

import java.util.Stack;

public class LimitedLIFOList<E> extends Stack<E> {
    private static final long serialVersionUID = 1L;
    private int limite;

    public LimitedLIFOList(int limite) {
        this.limite = limite;
    }

    @Override
    public boolean add(E o) {
        super.add(o);
        // si el tamaño fuera mayor eliminamos uno 
        while (size() > limite) { super.pop(); }
        return true;
    }

    public int getLimite() {
        return limite;
    }

    public void setLimite(int limite) {
        this.limite = limite;
    }
}

ПРИМЕР:

private static void LIFO() {
    LimitedLIFOList<TextDataStatus> lifo = new LimitedLIFOList<TextDataStatus>(3);

    for (TextDataStatus d : datos) {
        lifo.add(d);
        System.out.println(lifo);

        if (lifo.size() == lifo.getLimite())
            System.out.println("quitamos > " + lifo.pop());
    }
}

Выход:

[TextDataStatus{action=1, content='A', start=1, end=6}
]
[TextDataStatus{action=1, content='A', start=1, end=6}
, TextDataStatus{action=1, content='B', start=2, end=7}
]
[TextDataStatus{action=1, content='A', start=1, end=6}
, TextDataStatus{action=1, content='B', start=2, end=7}
, TextDataStatus{action=1, content='C', start=3, end=8}
]
quitamos > TextDataStatus{action=1, content='C', start=3, end=8}

[TextDataStatus{action=1, content='A', start=1, end=6}
, TextDataStatus{action=1, content='B', start=2, end=7}
, TextDataStatus{action=1, content='D', start=4, end=9}
]
quitamos > TextDataStatus{action=1, content='D', start=4, end=9}

[TextDataStatus{action=1, content='A', start=1, end=6}
, TextDataStatus{action=1, content='B', start=2, end=7}
, TextDataStatus{action=1, content='E', start=5, end=10}
]
quitamos > TextDataStatus{action=1, content='E', start=5, end=10}

ЗАМЕЧАНИЯ:

  • чтобы получать твою цель ты должен осуществлять LimitedFIFOList
  • ища информацию я увидел, что парни Апачи (как нет... ^_^) уже у него есть так называемое осуществление CircularFIFOQueue.
  • глаз, потому что возможно менять им размер, если ты хочешь сделать петлю, sobreescribe setSize() для того, чтобы он ничего не сделал.

    @Override
    public void setSize(int size) {
    }
    

Я надеюсь объясниться хорошо и осветленные твои сомнения, также, если у тебя есть какое-то сомнение, освисти меня :).

5
ответ дан 24.11.2019, 13:56
  • 1
    Не человек, ее создал я!!;) ты Должен включать ее в твой проект, copy паситесь и llest! – Jordi Castilla 04.07.2016, 17:37
  • 2
    устрицы, я понимаю, что я не поместил код LimitedLIFOList!! Когда он прибудет в дом, я это обновляю для того, чтобы был полный ответ – Jordi Castilla 04.07.2016, 17:44
  • 3
    Я иду batellando, с LimitedFIFOList, которая является той, которая мне кажется, что это указанная – Webserveis 04.07.2016, 17:48
  • 4
    если, из-за образца данных я делал ставку на FIFO (нравиться и # 237; в который ты обновишь титул и вопрос, если это эксперт и # 237;). Но также, мне кажется, что завершать ответ может помогать будущему лекторату и предотвращать вопросы а удвоенные, очень сходные. – Jordi Castilla 04.07.2016, 17:49
  • 5
    я не имею никакого IDE по отношению к руке, но он заканчивает тем, что почти равно как другая но public class LimitedLIFOList<E> extends Stack<E> {, метод, который у тебя есть, что sobreescribir (с самим c и # 243; я говорю) его push(E e) это очень легко следуя примеру другой – Jordi Castilla 04.07.2016, 18:14

, Оплаченные Благодаря soluciГіn @Jordi_Castilla я использовал mГ©todo LimitedLIFOList продолжая его указания реализовал следующее:

public class LimitedLIFOList<E> extends Stack<E> {
    private int limite;

    public LimitedLIFOList(int limite) {
        this.limite = limite;
    }

    @Override
    public E push(E o) {
        super.push(o);
        if (size() > limite) { super.remove(0); }
        return o;
    }
}

Тест: Последованные

LimitedLIFOList<TextDataStatus> fifo2 = new LimitedLIFOList<>(3);

fifo2.push(new TextDataStatus(1,"A",0,0));
fifo2.push(new TextDataStatus(1,"B",0,0));
fifo2.push(new TextDataStatus(2,"C",0,0));
fifo2.push(new TextDataStatus(1,"D",0,0));
fifo2.push(new TextDataStatus(1,"E",0,0));
fifo2.push(new TextDataStatus(3,"F",3,1));

:

I/System.out: TextDataStatus{action=1, content='D', start=0, end=0}
I/System.out: TextDataStatus{action=1, content='E', start=0, end=0}
I/System.out: TextDataStatus{action=3, content='F', start=3, end=1}
1
ответ дан 24.11.2019, 13:56

Теги

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