Объединение последнего значения с последними n значениями - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь создать реактивный конвейер, который принимает символы (0-9, *, #), введенные на матричной клавиатуре 4x3 , и отображает их на 4-значном семизначном сегментный дисплей . То есть для каждого нового элемента, который испускается, мне нужно объединить его с предыдущими значениями n = 3.

До сих пор я выставлял PublishSubject<Character> keypresses в классе контроллера клавиатуры. Этот класс, однако, испускает все нажатия клавиш. То есть, даже если вы нажмете клавишу (например, 1) только на мгновение, будет выдано несколько единиц. Поэтому я использую оператор debounce, чтобы гарантировать, что на одно нажатие клавиши выдается только один Character:

KeypadController kbc = new KeypadController();
kbc.keypresses.debounce(250, TimeUnit.MILLISECONDS)
    .subscribe(c -> {System.out.println(c);});

Пока все хорошо. На другом конце спектра у меня есть 4-значный класс контроллера семисегментного дисплея. Этот класс предоставляет методы writeDigit(int position, char value) и clearScreen(). То есть, если я хочу отобразить число 7654, мне нужно вызвать метод четыре раза:

SevenSegmentController segment = new SevenSegmentController();
segment.writeDigit(3,'7')
segment.writeDigit(2,'6')
segment.writeDigit(1,'5')
segment.writeDigit(0,'4')

Однако мне бы хотелось, чтобы дисплей постоянно обновлялся в виде пользовательских клавиш цифрами. Как показывает следующий сценарий.

user presses 7
|----| segment.writeDigit(0,'7')
|   7|
|----|

user presses 6
|----| segment.writeDigit(1,'7')
|  76| segment.writeDigit(0,'6')
|----| 

user presses 5
|----| segment.writeDigit(2,'7') 
| 765| segment.writeDigit(1,'6') 
|----| segment.writeDigit(0,'5')

user presses 4
|----| segment.writeDigit(3,'7') 
|7654| segment.writeDigit(2,'6') 
|----| segment.writeDigit(1,'5')
       segment.writeDigit(0,'4')

Finally,
|----| Display clears after timeout (1000ms without input)
|    | or if user presses 5th key
|----| segment.clearScreen()

Метод ReplaySubject с его методом createWithTimeAndSize выглядел многообещающим, поскольку в нем сохраняется не более заданного числа элементов, которые также не старше указанного количества времени. Однако такое поведение проявляется только при подписке, после чего наблюдатели непрерывно получают с этого момента. Существует ли способ для ReplaySubject - или какого-либо другого класса / метода rxjava - непрерывно выводить последние 4 цифры в течение определенного промежутка времени, скажем, 2000 мс.

...