Сортировка 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);
→ Ссылка