2017-09-27 14 views
2

私は複数のエントリを含むLinkedHashMapを持っています。最初のステップで複数のエントリを1つに減らし、それを1つのStringにマッピングするよりも、たとえば : は、私はこのような地図で始めている:Java 8ストリームリダクションマップ

{"<a>"="</a>", "<b>"="</b>", "<c>"="</c>", "<d>"="</d>"} 

そして最後に、私はこのような文字列を取得したい:(

<a><b><c><d></d></c></b></a> 

その場合、文字列のキーが含まれています私はmap.entrySet()。stream()。reduce()が必要だと思いますが、私は持っているどのようにreduceメソッドに書き込むべきか、どのように続行するかはわかりません。ここ

+0

「複数のエントリを1つに減らす」という意味ははっきりしません。何の一つ? 1つのエントリ?そして、あなたは一般的な解決策をどういう意味ですか? – gdejohn

+0

私は、複数のエントリーを一つのエントリーに減らしたいと思います。 reduce()メソッドはBinaryOperatorを使用します。私の例では、このBinaryOperatorは2つのエントリを取得し、2つのキーを連結し、2つの値を「逆方向連結」します。しかし、私はそれを実装する方法を知らない。 またreduce()にはidentity要素が必要です –

+2

中間の縮小エントリが存在するのは本当に要件ですか?これは、「私は一般的な解決策を望んでいる」という陳述と矛盾する。例えば。あなたは単純に 'String result = String.join(" "、map.keySet())+ map.values()。stream()。reduce(" "、(a、b) - > b + a);' 。あなたが単一の 'Stream'オペレーションを主張するならば、あなたは' String result = Stream.concat(map.keySet()。stream()、map.values()。stream()。collect(ArrayDeque :: new、 Map.Entry'インスタンスを構築せずに、ArrayDeque :: addFirst、(a、b) - > b.descendingIterator().EachRemaining(a :: addFirst))ストリーム()).collect(Collectors.joining()); 。 – Holger

答えて

4

あなたはエントリを削減しているのでキーと値をキーと値とを連結することで、探しているアイデンティティは、キーと値の両方に空の文字列を持つエントリになります。

String reduceEntries(LinkedHashMap<String, String> map) { 
    Entry<String, String> entry = 
     map.entrySet() 
      .stream() 
      .reduce(
       new SimpleImmutableEntry<>("", ""), 
       (left, right) -> 
        new SimpleImmutableEntry<>(
         left.getKey() + right.getKey(), 
         right.getValue() + left.getValue() 
        ) 
      ); 
    return entry.getKey() + entry.getValue(); 
} 

Java 9には、不変エントリを作成するための静的メソッドMap.entry(key, value)が追加されています。

+0

これは私が考えていた機能的な解決策です。しかし、いくつかの説明を使用することができます。 –

+0

ありがとう、それはそれを行う必要があります。私の主な問題は、Entryをインスタンス化できないということでした。 SimpleImmutableEntryは問題を解決するはずです。 –

+0

それは私に "ラムダ式の互換性のないパラメータ型"を与える –

0

は、私はそれを行うだろう方法についての例である:

import java.util.LinkedHashMap; 

public class Main { 

    static String result = ""; 

    public static void main(String [] args) 
    { 
     LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); 
     map.put("<a>", "</a>"); 
     map.put("<b>", "</b>"); 
     map.put("<c>", "</c>"); 
     map.put("<d>", "</d>"); 

     map.keySet().forEach(s -> result += s); 
     map.values().forEach(s -> result += s); 

     System.out.println(result); 
    } 
} 

注:値を逆にすることができます()ArrayUtils.reverse(との最初のD得るために)

+1

はい、そのようにするのは簡単ですが、私は特にストリームソリューションに興味があります。おそらくCollectors.joining()やCollectors.reducing()のようなものが適切かもしれませんが、ストリーム関連の単一ステートメントで作成したいのです –