Сортировка HashMap строковое значение
Суть задания такая, из консоли(в моем случае powershell) взять среднее значение ping любого сервера. Все сделал, взял, занес в переменные. Но нужно вывести в порядке убывания среднего времени отклика, как это можно сделать?
public class lab1 {
public static void main(String[] args) throws Exception {
System.out.println("Введите 3 IP адреса: ");
ArrayList<String> ip = new ArrayList<>();
ArrayList<String> averageTime = new ArrayList<>();
HashMap<String,String> ipAndAverageTime = new HashMap<>();
Scanner scr = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
ip.add(scr.nextLine());
averageTime.add(getAverageTime(ip.get(i)));
ipAndAverageTime.put(ip.get(i), averageTime.get(i));
}
}
public static String getAverageTime(String ip) throws IOException {
String command = String.format("ping %s | ForEach-Object {if($_ -match 'Average = (\\d+)'){$Matches[1]}}", ip);
ProcessBuilder builder = new ProcessBuilder(
"powershell.exe", "/c", command);
builder.redirectErrorStream(true);
Process p = builder.start();
BufferedReader r = new BufferedReader(new
InputStreamReader(p.getInputStream()));
String averageTime;
averageTime = r.readLine();
if(averageTime == null) {
System.out.println("Не правильный IP адрес");
System.exit(-1);
}
return averageTime;
}
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Для вывода содержимого хешмапы в отсортированном порядке можно воспользоваться методом Stream::sorted, где поток данных будет получен из множества элементов этой хешмапы entrySet:
Map<String, String> ipResponse = Map.of(
"127.0.0.1", "1",
"8.8.8.8", "15",
"194.38.168.170", "135"
);
// сортировка по численному значению 135 > 15 > 1
ipResponse.entrySet()
.stream()
.sorted(Map.Entry.<String, String>comparingByValue(Comparator.comparingInt(Integer::parseInt)).reversed())
.forEach(System.out::println);
194.38.168.170=135
8.8.8.8=15
127.0.0.1=1
// сортировка в обратном лексикографическом порядке "15" > "135" > "1"
ipResponse.entrySet()
.stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.forEach(System.out::println);
8.8.8.8=15
194.38.168.170=135
127.0.0.1=1
Или же можно создать сортированное множество SortedSet с требуемым компаратором, добавить в него содержимое мапы, и вывести:
SortedSet<Map.Entry<String, String>> sorted = new TreeSet<>(Map.Entry.comparingByValue(Comparator.reverseOrder()));
sorted.addAll(ipResponse.entrySet());
sorted.forEach(System.out::println);