Javaの8ストリーム要素を見つけて、新しいリストの先頭に追加します

ジョー:

これは、Java Streamsを使用して1行でこの問題を解決することが可能である場合、私は疑問に思って:私は、文字列のリストで文字列を検索し、検索文字列(見つかった場合は)新しいリストの最初の文字列になり、別のリストを作成する必要があります[文字列値の残りの部分

例:の場合:

List<String> oldList = Arrays.asList("Avacado", "Apple", "Orange", "Chocolate");

だから今、検索フィルタ「チョコレート」を言う使用している場合ならば、そのは順番に「チョコレート」、「Avacado」、「アップル」、「オレンジ」の要素を含む新しいリストを返す必要があります。

List<String> newList =  oldList.stream().filter(i -> i.equals("Chocolate")).collect(Collectors.toList()) ???
ルシオ:

あなたは使用してソリューションを求めていますStreamこれは、1つです。

    List<String> sorted = oldList.stream()
            .sorted(Comparator.comparing("Chocolate"::equals).reversed())
            .collect(Collectors.toList());
    System.out.println(sorted);

そして、それは与えます:

[Chocolate, Avacado, Apple, Orange]

だから、唯一の"Chocolate"最初のインデックスで移動させました。

しかし、実際にはヨン必要はありませんStreamリスト自体は十分です。

oldList.sort(Comparator.comparing("Chocolate"::equals).reversed());
System.out.println(oldList);

結果は

[Chocolate, Avacado, Apple, Orange]

... 同じ。

EDIT:
@Holgerは、それが契約に違反したと指摘したように、私は私の答えを更新しましたComparator.compare(o1,o2)私はホルガーが彼のコメントで提案された解決策を使用しています。私は、正しい解決策を得るために2回苦労ように、彼はupvotedされなければなりません。

このアプローチは、各文字列をマッピングするboolean文字列がに等しいかどうかを述べ値"Chocolate"平等の場合はBoolean.compare(x,y)戻ります1x-1するためにy他の文字列が等しくない場合"Chocolate"場合xyされているに等しい"Chocolate"結果です0
私たちが移動するとして"Chocolate"最初のインデックスには、インデックスが減少しています。従って(reveresedコンパレータ1=> -1および-1=> 1が必要です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=201364&siteId=1