Преобразовать поток в строку в Java - PullRequest
4 голосов
/ 04 июля 2019

Я хочу преобразовать поток карты <> в строку, чтобы добавить его в textArea.Я попробовал несколько методов, последний с StringBuilder, но они не работают.

public <K, V extends Comparable<? super V>> String sortByAscendentValue(Map<K, V> map, int maxSize) {

    StringBuilder sBuilder = new StringBuilder();

    Stream<Map.Entry<K,V>> sorted =
            map.entrySet().stream()
               .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()));

    BufferedReader br = new BufferedReader(new InputStreamReader((InputStream) sorted));
    String read;

    try {
        while ((read=br.readLine()) != null) {
            //System.out.println(read);
            sBuilder.append(read);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    sorted.limit(maxSize).forEach(System.out::println);

    return sBuilder.toString();
}

Ответы [ 3 ]

7 голосов
/ 04 июля 2019

Вы можете собрать записи в один String следующим образом:

  String sorted =
        map.entrySet().stream()
           .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
           .map(e-> e.getKey().toString() + "=" + e.getValue().toString())
           .collect(Collectors.joining (","));
1 голос
/ 04 июля 2019

Рассмотрим небольшое изменение кода @ Eran , учитывая тот факт, что HashMap.Entry.toString() уже присоединяется к = для вас:

String sorted =
    map.entrySet().stream()
        .sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
        .map(Objects::toString)
        .collect(Collectors.joining(","));
1 голос
/ 04 июля 2019

Это легко сделать, вы можете использовать API Steams для этого.Во-первых, вы отображаете каждую запись на карте в одну строку - объединенную строку ключа и значения.Если у вас есть это, вы можете просто использовать метод reduce() или collect(), чтобы сделать это.

Фрагмент кода с использованием метода Reduce () будет выглядеть примерно так:

    Map<String, String> map = new HashMap<>();
    map.put("sam1", "sam1");
    map.put("sam2", "sam2");

    String concatString = map.entrySet()
        .stream()
        .map(element-> element.getKey().toString() + " : " + element.getValue().toString())
        .reduce("", (str1,str2) -> str1 + " , " + str2).substring(3);

    System.out.println(concatString);

Это даст вам следующий вывод:

sam2 : sam2 , sam1 : sam1

Вы также можете использовать метод collect()' method instead of redu () `.Это будет выглядеть примерно так:

    String concatString = map.entrySet()
            .stream()
            .map(element-> element.getKey().toString() + " : " + element.getValue().toString())
            .collect(Collectors.reducing("", (str1,str2) -> str1 + " , " + str2)).substring(3);

Оба метода дают одинаковый вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...