Как отсортировать вывод строк по одному из значений в ней. 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())
Её нужно наполнять из ваших потоков, и видимо она либо должна передаваться всем потокам, либо быть статической и в том классе от куда вы запускаете все потоки, а после завершения всех потоков выводить на печать в порядке чтения из мапы.
Я могу быть не прав, так как вижу только класс из которого создаются потоки.