Как отсортировать вывод строк по одному из значений в ней. JAVA

Нужно отсортировать вывод строк от наименьшего к наибольшему значению whatTimeIsIt

System.out.println ("Thread's: " + threads + " ; x = " + sum + " ; time = " + whatTimeIsIt/1000+ " sec or " + whatTimeIsIt + " millisec");

Код класса:

import java.util.concurrent.atomic.AtomicInteger;
    
    public class T implements Runnable {
        private int threads;
       // public double sum = 0;
      /*  long time = System.currentTimeMillis();*/
    
        T(int threads) {
            this.threads = threads;
        }
        private AtomicInteger count = new AtomicInteger(0);//Потокобезопасный счетчик, реализован с помощью AtomicInteger
    
        public boolean isEnd() {
            return  threads == count.get();
        }
    
        private Double sum = 0d;
    
         private long whatTimeIsIt;
    
        /* public long getWhatTimeIsIt() {
             return whatTimeIsIt;
         } */
        @Override
        public String toString() {
            return "ThreadsCalc{" +
                    "threads=" + threads +
                    ", sum=" + sum +
                    ", whatTimeIsIt=" + whatTimeIsIt +
                    '}';
        }
      /*  void ThreadsCalc(int threads) {
            this.threads = threads;
        }*/
    
        private synchronized void addSum(double value) {
            sum += value;
        }
        @Override
        public void run() {
            long time = System.currentTimeMillis();
            double a = 0;
            double b = Math.PI;
            double interval = b - a;
            double step = interval / threads;
            for (int i = 0; i < threads; i++) {
                int finalI = i;
                new Thread(()->{
              /*  sum += (new Integral(x -> Math.cos(x), (a + i * step), (a + (i + 1) * step), 10e-9).calc());
            }
            System.out.println("Thread: " + threads + " Sum: " + sum + " Time: " + (System.currentTimeMillis() - time));
    
        }
    } */
                    addSum(new Integral(x -> Math.sqrt(Math.abs(Math.cos(x))), (a + finalI * step), (a + (finalI + 1) * step), Math.pow(10, -8)).calc());
                    count.incrementAndGet();//Метод incrementAndGet () класса Java AtomicInteger увеличивает значение на единицу и обновляет старое значение.
                }).start();
            }
            while (!isEnd()) {
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            whatTimeIsIt = System.currentTimeMillis() - time;
            System.out.println ("Thread's: " + threads + " ; x = " + sum + " ; time = " + whatTimeIsIt/1000+ " sec or " + whatTimeIsIt + " millisec");
            
        }
    }

Сейчас вывод не отсортирован по времени:

Thread's: 1 ; x = 2.3962804722494115 ; time = 5 sec or 5136 millisec
Thread's: 2 ; x = 2.3962804702212157 ; time = 2 sec or 2391 millisec
Thread's: 3 ; x = 2.396280457155316 ; time = 1 sec or 1688 millisec
Thread's: 4 ; x = 2.3962804596833416 ; time = 1 sec or 1461 millisec
Thread's: 5 ; x = 2.3962804649313862 ; time = 1 sec or 1324 millisec
Thread's: 6 ; x = 2.3962804456271565 ; time = 1 sec or 1110 millisec
Thread's: 7 ; x = 2.3962804577511063 ; time = 0 sec or 971 millisec
Thread's: 8 ; x = 2.3962804594727767 ; time = 0 sec or 985 millisec
Thread's: 9 ; x = 2.3962804502039163 ; time = 1 sec or 1034 millisec
Thread's: 10 ; x = 2.396280429796376 ; time = 1 sec or 1026 millisec

Ответы (1 шт):

Автор решения: Сабир Исламов

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

Map<Integer, String> map = Collections.synchronizedMap(new TreeMap<>(Collections.reverseOrder()));

Эта карта обладает упорядоченностью (TreeMap) в обратном порядке (Collections.reversOrder()) и при этом потокобезопасна (Collections.synchronizedMap())

Её нужно наполнять из ваших потоков, и видимо она либо должна передаваться всем потокам, либо быть статической и в том классе от куда вы запускаете все потоки, а после завершения всех потоков выводить на печать в порядке чтения из мапы.

Я могу быть не прав, так как вижу только класс из которого создаются потоки.

→ Ссылка