JAVA - извлекать и хранить все элементы очереди - PullRequest
0 голосов
/ 03 июля 2018

В моем приложении у меня есть очередь, состоящая из 4 элементов, каждый элемент является HashMap

BlockingQueue<HashMap<Integer, double[]>> myInput;

Теперь я могу извлечь все 4 компонента, делая что-то вроде:

                try {
                        firstElement = myInput.take();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(DirectionOfArrival.class.getName()).log(Level.SEVERE, null, ex);
                    }

                try {
                        secondElement = myInput.take();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(DirectionOfArrival.class.getName()).log(Level.SEVERE, null, ex);
                    }

                try {
                        thirdElement = myInput.take();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(DirectionOfArrival.class.getName()).log(Level.SEVERE, null, ex);
                    }

                try {
                        fourthElement = myInput.take();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(DirectionOfArrival.class.getName()).log(Level.SEVERE, null, ex);
                    }

заканчивается тем, что:

firstElement
secondElement 
thirdElement 
fourthElement

Я хотел бы спросить вас, ребята, как бы вы выполнили вышеупомянутую операцию при работе с очередью, состоящей не только из 4 элементов (где легко получить firstElement, secondElement, thirdElement, четвертыйElement ), но, например, с очередью, состоящей из 400 элементов (важно отметить, что я хотел бы получить даже в этом сценарии что-то вроде firstElement, secondElement, ..., fourhundredthElement).

Есть ли быстрый и элегантный способ сделать это?

Любая помощь будет высоко оценена

Заранее большое спасибо

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Вам необходимо изменить код так, чтобы он содержал более абстрактный компонент обработки для записей в очереди. Это легко сделать с каким-то потребителем, в приведенном ниже примере просто используется простой метод.

Поскольку ваш код уже использует очередь блокировки, реализовать его с помощью цикла довольно просто:

BlockingQueue<HashMap<Integer, double[]>> myInput;

while(true) {
    this.process(myInput.take());
}

И метод process может выглядеть следующим образом:

private void process(Map<Integer, double[]> queueInput) {
    System.out.println("Messageges:" + queueInput);
    //run meaningful code...
}

Вышеприведенное просто многократно считывает сообщения из очереди и обрабатывает их, когда они поступают.

0 голосов
/ 03 июля 2018

Есть ли быстрый и элегантный способ сделать это?

  1. Используйте цикл.

  2. Сохранять извлеченные элементы в List или массиве. Или обработайте их, как вы извлекаете их.

  3. Не используйте именованные переменные, такие как firstElement, secondElement и так далее. Это противоположность элегантности. Если вам нужно около 400 именованных элементов (со значимыми именами!), Подумайте об использовании HashMap.

0 голосов
/ 03 июля 2018

Извлеките код в методе и присвойте извлеченные значения в List, который вы передаете методу, с номером требуемого извлечения.
Чтобы сохранить номер операции для каждого результата (сбой как успешный), вам нужно будет что-то добавить в List даже при сбое операции, например null:

List<HashMap<Integer, double[]>> takenValues = new ArrayList<>();
int nbTimesRequired = 100;
for (int i=0; i<nbTimesRequired; i++) {     
    takeValues(myInput, takenValues);
}

И метод:

private static void takeValues(BlockingQueue<HashMap<Integer, double[]>> myInput, List<HashMap<Integer, double[]>> takenValues) {
    try {
        HashMap<Integer, double[]> element = myInput.take();
        takenValues.add(element);
    } catch (InterruptedException ex) {
      takenValues.add(null);   
      Logger.getLogger(DirectionOfArrival.class.getName()).log(Level.SEVERE, null, ex);

    }
 }

Лучше было бы использовать Optional вместо null, например:

List<Optional<HashMap<Integer, double[]>>> takenValues = new ArrayList<>();

Метод takeValues() может выглядеть следующим образом:

private static void takeValues(BlockingQueue<HashMap<Integer, double[]>> myInput, List<Optional<HashMap<Integer, double[]>>> takenValues) {
    try {
        HashMap<Integer, double[]> element = myInput.take();
        takenValues.add(Optional.of(element));
    } catch (InterruptedException ex) {
        takenValues.add(Optional.empty());
        Logger.getLogger(DirectionOfArrival.class.getName()).log(Level.SEVERE, null, ex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...